当我们在使用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. elaticsear no [query] registered for [filtered] 错误

    1.问题描述 执行语句: GET /megacorp/employee/_search { "query" : { "filtered" : { "f ...

  2. 2018年高教社杯全国大学生数学建模竞赛A题解题思路

    题目 先贴一下A的题目吧 A题   高温作业专用服装设计 在高温环境下工作时,人们需要穿着专用服装以避免灼伤.专用服装通常由三层织物材料构成,记为I.II.III层,其中I层与外界环境接触,III层与 ...

  3. Docker容器学习梳理 - 容器硬盘热扩容

    前面已介绍了docker很多知识点的操作记录,今天这里梳理下docker容器空间扩展的操作.默认情况下,物理机下创建的docker容器的空间是10G(虚拟机下创建的docker容器空间就是虚拟机的空间 ...

  4. Linux系统入门教程:如何在 Linux 中修改默认的 Java 版本

    提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...

  5. IDEA启动服务阻塞,断点过程十分慢的问题

    使用debug无法启动项目但是使用run就可以启动程序,而且启动比以前的debug模式快的多 原因: 启动不了的原因是在项目中的方法上打了断点,导致项目无法继续编译 取消方法断点就可以了 在idea官 ...

  6. Linux内核分析——第四章 进程调度

    第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...

  7. 五子棋游戏SRS

    一.功能需求 1.绘制棋子 2.绘制界面 3.绘制棋盘 4.实现通过鼠标下棋并判断棋子是否落在棋盘上 6.判断胜负 二.用例图 玩家用例图: 1.落子:玩家鼠标点击最近的落子点落子.2.电脑先落子:选 ...

  8. Linux入门笔记

    1.Linux常用快捷键 按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s  暂停当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl ...

  9. Beta阶段敏捷冲刺二

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:连接上数据库 (2) 今天计划完成的工作:修改学习界面单词获取 (3) 工作中遇到的困难:虽然前天询 ...

  10. Gradle下载类库源码

    https://blog.csdn.net/xiaoxing598/article/details/68958383 备选:https://www.cnblogs.com/yoyotl/p/62917 ...