当我们在使用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. 使用 cron 定时任务实现 war 自动化发布

    autoRelease.sh #!/bin/sh /home/tomcat/bin/shutdown.sh echo "tomcat stoped" cd /home/tomcat ...

  2. 这里已不再更新,访问新博客请移步 http://www.douruixin.com

    这里已不再更新,访问新博客请移步 http://www.douruixin.com

  3. Vuex实现原理解析

    我们在使用Vue.js开发复杂的应用时,经常会遇到多个组件共享同一个状态,亦或是多个组件会去更新同一个状态,在应用代码量较少的时候,我们可以组件间通信去维护修改数据,或者是通过事件总线来进行数据的传递 ...

  4. 饿了么element UI<el-dialog>弹出层</el-dialog>修改默认样式不能在<style scoped>修改

    如果在非scoped下,修改el-dialog自动添加的DIV类名的style加上important,可以覆盖原来的width,但这样会让整个项目的样式都乱套. 如果在scoped下修改style.所 ...

  5. dxteam团队项目终审报告

    一. 团队成员的简介和个人博客地址 M1阶段 http://www.cnblogs.com/dxteam/p/3991514.html M2阶段 新成员 邓亚梅 http://www.cnblogs. ...

  6. 12.24daily_scrum

    今天是平安夜,大家开心地度过一个平安夜的同时,也完成了很多软件的调试工作,我们争取在下周前完成本阶段的所有调试工作. 具体工作如下: 具体工作: 小组成员 今日任务 明日任务 工作时间 李睿琦 软件调 ...

  7. 剑指offer:树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 同样考虑用递归来做. 利用两个递归函数,一个用于判断两棵树树否相等,另一个递归取A的 ...

  8. java面对对象(六)--内部类、匿名内部类

    内部类 可以在一个类的内部定义另一个类这种类成为内部类或嵌套类,比如: class Outer{ … class Inner{ …. } } class Outer1{} // 这个Inner1不是O ...

  9. Filter(转载)

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  10. 开源通用爬虫框架YayCrawler-页面的抽取规则定义

    本节我将向大家介绍一下YayCrawler的核心-页面的抽取规则定义,这也是YayCrawler能够做到通用的主要原因之一.如果我要爬去不同的网站的数据,尽管他们的网站采用的开发技术不同.页面的结构不 ...