当我们在使用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. maven项目中 org.hibernate.MappingNotFoundException: resource:*.hbm.xml not found问题的解决方案

    是因为*.hbm.xml没有放到resource的mapper下导致的 对于Maven工程,编译的工作是由Maven程序来完成的,而Maven默认只会把src/main/resources文件夹下的文 ...

  2. .Net core使用EF Core Migration做数据库升级

    ---恢复内容开始--- (1)VS Code下创建含有授权功能的并且使用localdb作为数据库的命令 dotnet new -au individual -uld --name identityS ...

  3. Linux内核分析——期中总结

    期中总结 一.MOOC课程 (一)计算机是如何工作的 1.冯诺依曼体系结构的核心思想是存储程序计算机. 2.CPU在实际取指令时根据cs:eip来准确定位一个指令. 3.寄存器模式,以%开头的寄存器标 ...

  4. SQL中常用函数

    SELECT CONVERT(varchar(100), GETDATE(), 23) AS  日期   结果:2017-01-05     select ISNULL(price,'0.0')   ...

  5. MySQLi面向对象实践--multi_query

    使用multi_query可以实现执行多条SQL语句,每一条SQL语句通过分号分隔. 需要注意的是: 多条用分号分隔的SQL语句中,只要有一条SQL语句执行失败,那么这一条SQL语句以及之后的SQL语 ...

  6. 自定义Label控件

    最近开发过程中有一个需求就是修改label控件的模板,使其能够在鼠标移近的时候变成TextBox,从而方便输入,然后进行相应的修改,最终达到动态修改Label的目的,这里贴出相应的代码,并做简要的分析 ...

  7. 简单FTP服务器搭建

    1 配置IIS 打开控制面板-卸载程序-点击 打开或关闭windows功能-勾选 internet信息服务-确定 2 配置iis web站点 开始菜单-搜索iis并进入iis管理器(计算机-右键-管理 ...

  8. Delphi通过查找字符定位TADOQuery数据的位置

    通过TADOQuery的方法Locate,输入字符,查找到定位到对应的数据位置,优点快速定位,缺点是只匹配查找到的和第一个位置,无法连续定位下一个! //定位qrymembertype.Locate( ...

  9. git worktree 是什么及其使用场景

    先上总结: 在git worktree出现之前, git切换分支前后的文件都只存在在当前文件夹下, git worktree出现之后, 我们可以将分支切换到其他文件夹下 比如如果你的项目有很多个版本分 ...

  10. Gulp实现静态网页模块化的方法详解

    前言: 在做纯静态页面开发的过程中,难免会遇到一些的尴尬问题.比如:整套代码有50个页面,其中有40个页面顶部和底部模块相同.那么同样的两段代码我们复制了40遍(最难受的方法).然后,这个问题就这样解 ...