当我们在使用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. 非关系型数据库(nosql)介绍

    非关系型数据库也叫Nosql数据库,全称是not noly sql. 2009年初,Johan Oskarsson举办了一场关于开源分布式数据库的讨论,Eric Evans在这次讨论中提出了NoSQL ...

  2. postgresql总结

    这篇博客主要对PostgreSQL进行总结,内容偏基础. 这里先附上一个PostgreSQL的中文资源:PostgreSQL 8.1 中文文档.英文不好的同学可以看看这个. 安装PostgreSQL ...

  3. 四则运算coding

    https://coding.net/u/ztf1641429293/p/sizeyunshuan/git/blob/master/Sizenyunsuan.java

  4. 20135327郭皓--Linux内核分析第七周 可执行程序的装载

    第七周 可执行程序的装载 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ...

  5. 【转】七牛免费SSL证书,配置自定义域名CDN加速

    原文链接:https://excaliburhan.com/post/use-qiniu-ssl-and-cdn.html 申请七牛SSL证书 其实,七牛在很早之前就支持CDN使用https,但是他要 ...

  6. PAT 1066 图像过滤

    https://pintia.cn/problem-sets/994805260223102976/problems/994805266514558976 图像过滤是把图像中不重要的像素都染成背景色, ...

  7. Neo4j初探

    neo4j-desktop-win64 exe https://neo4j.com/download-thanks-desktop/?edition=desktop&flavour=winst ...

  8. java中的equals和==

    下面是我看别人博客和java API总结的 首先得明确一个概念就是: == 的用法   ==比较对象在内存中的地址是否相等.如是是两个基本数据类型变量的比较则比较的是这两个变量值是否相等,若是比较两个 ...

  9. [转载]Memory Limits for Windows and Windows Server Releases

    Memory Limits for Windows and Windows Server Releases This topic describes the memory limits for sup ...

  10. Windows 通过命令行设置固定ip地址

    Winserver1709 之后 windows系统取消了GUI界面 设置ip地址 需要使用命令行界面进行 这里简单记录一下 打开win1709的虚拟机 进入命令行控制台 输入 ipconfig 查看 ...