已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com

在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功。决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 。这篇文章有700多条评论,所以应该还是经历过比較多的讨论的。在overstackflow的一些解答中,也是直接引用了这篇文章。分享给有须要的同学。

译文:

在大多数的Android演示样例或是教程中,都是如果你须要在程序执行的时候创建一个数据库并插入新的数据,而不是使用一个独立的提前读取的数据库。

这里要讲到的是,如何使用你自己的存储在“assets”目录下的SQLite数据库,即如何将你准备好的数据库拷贝到你Android程序的系统数据库路径下,从而让SQLiteDatabase API可以正常的读取它。

  1. 准备SQLite database文件

如果你已经创建了一个sqlite数据库,我们须要对其进行一些改动。

(译者注:这里原文是推荐了一个SQLite数据库管理软件。这个我认为能够随自己的喜好,最Windows以下有多款可视化的SQlite数据库管理软件,能够方便的读取。编辑数据库,比如我用的是sqlitestudio

打开数据库。加入一个新的table “android_metadata",插入一行数据,详细的SQL例如以下:

  1. CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
  2.  
  3. INSERT INTO "android_metadata" VALUES ('en_US')

(译者注:上面两行是表明须要进行的操作,详细能够直接在sqlitesstudio中完毕)

然后你须要对你数据表格的primary id 列重命名为 “_id”。这样Adroid会知道怎么对id列进行绑定,你能够非常easy的在SQlite数据库管理软件中进行列编辑。

这两步之后,你的sqlite数据库文件就准备好了。

(译者注:这里我保留了id列,即没有对其进行重命名,測试证明也是没有问题的)

2. 在你的Android程序中复制,打开以及訪问数据库

如今把你上一步准备好的数据库文件放在“assets”目录以下。然后通过继承 SQLiteOpenHelper类来创建一个Database Helper类。

你的DataBaseHelper类大致能够例如以下:

  1. public class DataBaseHelper extends SQLiteOpenHelper{
  2.  
  3. //The Android's default system path of your application database.
  4. private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
  5.  
  6. private static String DB_NAME = "myDBName";
  7.  
  8. private SQLiteDatabase myDataBase;
  9.  
  10. private final Context myContext;
  11.  
  12. /**
  13. * Constructor
  14. * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
  15. * @param context
  16. */
  17. public DataBaseHelper(Context context) {
  18.  
  19. super(context, DB_NAME, null, 1);
  20. this.myContext = context;
  21. }
  22.  
  23. /**
  24. * Creates a empty database on the system and rewrites it with your own database.
  25. * */
  26. public void createDataBase() throws IOException{
  27.  
  28. boolean dbExist = checkDataBase();
  29.  
  30. if(dbExist){
  31. //do nothing - database already exist
  32. }else{
  33.  
  34. //By calling this method and empty database will be created into the default system path
  35. //of your application so we are gonna be able to overwrite that database with our database.
  36. this.getReadableDatabase();
  37.  
  38. try {
  39.  
  40. copyDataBase();
  41.  
  42. } catch (IOException e) {
  43.  
  44. throw new Error("Error copying database");
  45.  
  46. }
  47. }
  48.  
  49. }
  50.  
  51. /**
  52. * Check if the database already exist to avoid re-copying the file each time you open the application.
  53. * @return true if it exists, false if it doesn't
  54. */
  55. private boolean checkDataBase(){
  56.  
  57. SQLiteDatabase checkDB = null;
  58.  
  59. try{
  60. String myPath = DB_PATH + DB_NAME;
  61. checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  62.  
  63. }catch(SQLiteException e){
  64.  
  65. //database does't exist yet.
  66.  
  67. }
  68.  
  69. if(checkDB != null){
  70.  
  71. checkDB.close();
  72.  
  73. }
  74.  
  75. return checkDB != null ? true : false;
  76. }
  77.  
  78. /**
  79. * Copies your database from your local assets-folder to the just created empty database in the
  80. * system folder, from where it can be accessed and handled.
  81. * This is done by transfering bytestream.
  82. * */
  83. private void copyDataBase() throws IOException{
  84.  
  85. //Open your local db as the input stream
  86. InputStream myInput = myContext.getAssets().open(DB_NAME);
  87.  
  88. // Path to the just created empty db
  89. String outFileName = DB_PATH + DB_NAME;
  90.  
  91. //Open the empty db as the output stream
  92. OutputStream myOutput = new FileOutputStream(outFileName);
  93.  
  94. //transfer bytes from the inputfile to the outputfile
  95. byte[] buffer = new byte[1024];
  96. int length;
  97. while ((length = myInput.read(buffer))>0){
  98. myOutput.write(buffer, 0, length);
  99. }
  100.  
  101. //Close the streams
  102. myOutput.flush();
  103. myOutput.close();
  104. myInput.close();
  105.  
  106. }
  107.  
  108. public void openDataBase() throws SQLException{
  109.  
  110. //Open the database
  111. String myPath = DB_PATH + DB_NAME;
  112. myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  113.  
  114. }
  115.  
  116. @Override
  117. public synchronized void close() {
  118.  
  119. if(myDataBase != null)
  120. myDataBase.close();
  121.  
  122. super.close();
  123.  
  124. }
  125.  
  126. @Override
  127. public void onCreate(SQLiteDatabase db) {
  128.  
  129. }
  130.  
  131. @Override
  132. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  133.  
  134. }
  135.  
  136. // Add your public helper methods to access and get content from the database.
  137. // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
  138. // to you to create adapters for your views.
  139.  
  140. }

就这样。

如今你能够创建一个新的DataBaseHelper实例,然后调用createDataBase()。然后再调用openDataBase()方法,记住改动DB_PATH字符串中“YOUR_PACKAGE”为你真正的package名称(也就是说com.examplename.myapp)

下面是示范代码:

  1. ...
  2.  
  3. DataBaseHelper myDbHelper = new DataBaseHelper();
  4. myDbHelper = new DataBaseHelper(this);
  5.  
  6. try {
  7.  
  8. myDbHelper.createDataBase();
  9.  
  10. } catch (IOException ioe) {
  11.  
  12. throw new Error("Unable to create database");
  13.  
  14. }
  15.  
  16. try {
  17.  
  18. myDbHelper.openDataBase();
  19.  
  20. }catch(SQLException sqle){
  21.  
  22. throw sqle;
  23.  
  24. }
  25.  
  26. ...

在Android程序中使用已有的SQLite数据库的更多相关文章

  1. Android程序猿必掌握的sqlite数据库连表查询

    SQL查询的基本原理:两种情况介绍. 第一.   单表查询:依据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的):然后依据SELECT的选择列选择对应的列进行返回终于结果. 第二 ...

  2. SQLite在Android程序中的使用方法,SQLite的增删查改方法

    Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...

  3. android 程序中res/values-v14/styles.xml报错的解决办法

    从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No ...

  4. 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity

    原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...

  5. 【转】在android程序中使用配置文件properties

    在android程序中使用配置文件来管理一些程序的配置信息其实非常简单 在这里我们主要就是用到Properties这个类直接给函数给大家 这个都挺好理解的 读写函数分别如下: //读取配置文件 pub ...

  6. 如何在 Android 程序中禁止屏幕旋转和重启Activity

    禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android ...

  7. 从Android手机中取出已安装的app包,导出apk

    从Android手机中取出已安装的app包,导出apk TAG:Android,提取,apk,adb,pm,root,导出apk 假设有这样一个场景,A君看到你手机上一个实用APP,想要安装到自己手机 ...

  8. Android 学习笔记之如何使用SQLite数据库来保存数据...

    PS:最近一阵子都在为考试复习...坑爹的计算机网络,复习了3天,最后该不会的还是不会...明天还考英语...真蛋疼... 学习内容: 1.使用SQLite数据库来保存数据... SQLite:   ...

  9. Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表,以及同步和异步执行模式)

    系列文章导航 Adobe AIR中使用Flex连接Sqlite数据库(1)(创建数据库和表) Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数) Adobe ...

随机推荐

  1. 【转】C# 二进制,十进制,十六进制 互转

    //十进制转二进制 Console.WriteLine(Convert.ToString(69, 2)); //十进制转八进制 Console.WriteLine(Convert.ToString(6 ...

  2. 排序算法小结:C++实现

    #include<vector> #include<iostream> //排序算法的稳定性:对于相同的关键字,排序之前的位置和排序之后的位置相同,则称为稳定排序,否则不稳定排 ...

  3. ProtoBuf - Arena

    1.概述 最近看 Protocal Buffer 的源码,初次见到这个库源自陈硕的 muduo ,便打算看一看,在此做一下记录.官网文档不能访问,只能凭借代码的自己理解,查看的源码版本为 3.6.0. ...

  4. 笔试算法题(04):实现 string & memcpy & strcpy & strlen

    出题:请实现给定String的类定义: 分析:注意检查标准类构造注意事项: 解题: #include <stdio.h> #include <string.h> /** * 检 ...

  5. 升级PHP7操作MongoDB

    前言 使用 PHP+MongoDB 的用户很多,因为 MongoDB 对非结构化数据的存储很方便.在 PHP5 及以前,官方提供了两个扩展,Mongo 和 MongoDB,其中 Mongo 是对以 M ...

  6. assert.deepStrictEqual()

    assert.deepStrictEqual(actual, expected[, message]) 一般情况下等同于 assert.deepEqual(),但有两个例外.首先,原始值是使用全等运算 ...

  7. 选项B中:int b[][3]={0,1,2,3}

    选项B中:int b[][3]={0,1,2,3};等价于 int b[][3]={0,1,2,3,0,0};    int b[][3]={0,1,2,3,4};         cout<& ...

  8. I - DFS(依然是漫水填充)

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  9. mat 服务器分析大堆,本地打开

    1:服务器执行nohup sh /usr/local/mat/ParseHeapDump.sh es9.bin org.eclipse.mat.api:suspects org.eclipse.mat ...

  10. expdp,impdp,include,exclude

    The examples below are based on:- the demo schema SCOTT that is created with script: $ORACLE_HOME/rd ...