当我们在使用SQLiteOpenHelper时,经常使用db.execSQL(String sql)方法写入对应语句实现创建表的操作,这样的确可以实现业务逻辑。与此同时还有一种更灵活的方法,从assets文件夹下读取对应的.sql文件,然后创建表。

1.首先在工程的assets文件夹下,添加对应的.sql文件

2.配置一个Configuration类,用于保存固定路径变量

  1. public class Configuration {
  2. public static final String DB_PATH = "schema";
  3. public static final String DB_NAME = "test.db";
  4. public static final int DB_VERSION = 1;
  5. public static int oldVersion = -1;
  6. }

3.逻辑实现类,executeAssetsSQL方法用于向Assets文件夹对应的路径读取SQL语句然后执行创建操作

  1. public class DBHelper extends SQLiteOpenHelper {
  2. private Context mContext;
  3. public DBHelper(Context context, String databaseName,
  4. CursorFactory factory, int version) {
  5. super(context, databaseName, factory, version);
  6. mContext = context;
  7. }
  8. /**
  9. * 数据库第一次创建时调用
  10. * */
  11. @Override
  12. public void onCreate(SQLiteDatabase db) {
  13. executeAssetsSQL(db, "schema.sql");
  14. System.out.println("创建表");
  15. }
  16. /**
  17. * 数据库升级时调用
  18. * */
  19. @Override
  20. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  21. //数据库不升级
  22. if (newVersion <= oldVersion) {
  23. return;
  24. }
  25. Configuration.oldVersion = oldVersion;
  26. int changeCnt = newVersion - oldVersion;
  27. for (int i = 0; i < changeCnt; i++) {
  28. // 依次执行updatei_i+1文件      由1更新到2 [1-2],2更新到3 [2-3]
  29. String schemaName = "update" + (oldVersion + i) + "_"
  30. + (oldVersion + i + 1) + ".sql";
  31. executeAssetsSQL(db, schemaName);
  32. }
  33. }
  34. /**
  35. * 读取数据库文件(.sql),并执行sql语句
  36. * */
  37. private void executeAssetsSQL(SQLiteDatabase db, String schemaName) {
  38. BufferedReader in = null;
  39. try {
  40. in = new BufferedReader(new InputStreamReader(mContext.getAssets()
  41. .open(Configuration.DB_PATH + "/" + schemaName)));
  42. System.out.println("路径:"+Configuration.DB_PATH + "/" + schemaName);
  43. String line;
  44. String buffer = "";
  45. while ((line = in.readLine()) != null) {
  46. buffer += line;
  47. if (line.trim().endsWith(";")) {
  48. db.execSQL(buffer.replace(";", ""));
  49. buffer = "";
  50. }
  51. }
  52. } catch (IOException e) {
  53. Log.e("db-error", e.toString());
  54. } finally {
  55. try {
  56. if (in != null)
  57. in.close();
  58. } catch (IOException e) {
  59. Log.e("db-error", e.toString());
  60. }
  61. }
  62. }
  63. }

Android编程心得-在Assets文件夹中放入.sql文件实现创建SQlite表的操作的更多相关文章

  1. Android开发系列(十七):读取assets文件夹下的数据库文件

    在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中 ...

  2. 【HDFS API编程】查看目标文件夹下的所有文件、递归查看目标文件夹下的所有文件

    使用hadoop命令:hadoop fs -ls /hdfsapi/test  我们能够查看HDFS文件系统/hdfsapi/test目录下的所有文件信息 那么使用代码怎么写呢?直接先上代码:(这之后 ...

  3. res文件夹及xml资源文件详解

    目录 一.values文件:存放字符串(strings).颜色(colors).尺寸(dimens).数组(arrays).样式(styles类似于CSS文件).类型等资源 二.drawable:存放 ...

  4. 如何1秒批量提取电脑文件夹中的所有文件、文件夹名字到txt/excel

    01  在工作,我们经常会遇到这样的情况,有时候我们在一个文件夹中放了很多的文件,或者是这个文件夹中有很多的子文件夹,每一个子文件夹的名字又不同,也没有什么样的规律, 02  但是我们要整理一下这个文 ...

  5. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

  6. C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录

    要拷贝的文件及其文件夹结构 其中.lab文件不能覆盖 /// <summary> /// 拷贝oldlab的文件到newlab下面 /// </summary> /// < ...

  7. PHP遍历、删除文件夹中的所有文件

    <?php header("Content-type:text/html;charset=utf-8"); /** * getDirFile 遍历文件夹中的所有文件 * @p ...

  8. php 读取网页源码 , 导出成txt文件, 读取xls,读取文件夹下的所有文件的文件名

    <?php // 读取网页源码$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLO ...

  9. C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名

    1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...

随机推荐

  1. centos7下安装php+memcached简单记录

    1)centos7下安装php 需要再添加一个yum源来安装php-fpm,可以使用webtatic(这个yum源对国内网络来说恐怕有些慢,当然你也可以选择其它的yum源) [root@nextclo ...

  2. linux下rsync和tar增量备份梳理

    前面总结过一篇全量备份/增量备份/差异备份说明,下面介绍下linux下rsync和tar两种增量备份的操作记录: 1)rsync备份 rsync由于本身的特性,在第一次rsync备份后,以后每次都只是 ...

  3. Mysql基于GTID复制模式-运维小结 (完整篇)

    先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...

  4. StackOverflow 问题

    StackOverflow  这个问题一般是你的程序里头可能是有死循环或递归调用所产生的:可以查看一下你的程序,也可以增大你JVM的内存~~~在Eclipse中JDK的配置中加上   -XX:MaxD ...

  5. 1017 B. The Bits

    链接 [http://codeforces.com/contest/1017/problem/B] 题意 给你两个长度为n,包含0和1的字符串a和b,有一种操作swap a中的任意两个字符使得a&am ...

  6. 2-Twenty Fourth Scrum Meeting-20151230

    前言 因为服务器关闭,我们的开发项目也遭遇停滞一个星期.与网站开发负责人员协商之后,29号开放服务器.我们的项目也能够继续下去.比规定的开发时间(截止为2015/12/29)推迟. 事项安排 1.开发 ...

  7. Spring IOP 面向切面编程

    Spring IOP  面向切面编程 AOP操作术语 Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.(类里面 ...

  8. taskService 流程任务组件

    act_ru_task:任务表act_ru_identitylink:权限表(流程定义和用户组(用户)之间的权限数据)act_ru_variable:参数表act_hi_attachment:任务附件 ...

  9. Docker(十六)-Docker的daemon.json的作用

    docker安装后默认没有daemon.json这个配置文件,需要进行手动创建.配置文件的默认路径:/etc/docker/daemon.json 一般情况,配置文件 daemon.json中配置的项 ...

  10. [转帖]Nginx 的 TCP 负载均衡介绍

    Nginx 的 TCP 负载均衡介绍 https://www.cnblogs.com/felixzh/ 前几天同事问 nginx的代理 当时以为只有http的 现在看起来还有tcp的可以使用tcp 代 ...