已经将这篇文章迁移至 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例如以下:

CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')

INSERT INTO "android_metadata" VALUES ('en_US')

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

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

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

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

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

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

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

public class DataBaseHelper extends SQLiteOpenHelper{

    //The Android's default system path of your application database.
private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; private static String DB_NAME = "myDBName"; private SQLiteDatabase myDataBase; private final Context myContext; /**
* Constructor
* Takes and keeps a reference of the passed context in order to access to the application assets and resources.
* @param context
*/
public DataBaseHelper(Context context) { super(context, DB_NAME, null, 1);
this.myContext = context;
} /**
* Creates a empty database on the system and rewrites it with your own database.
* */
public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); if(dbExist){
//do nothing - database already exist
}else{ //By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); }
} } /**
* Check if the database already exist to avoid re-copying the file each time you open the application.
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); }catch(SQLiteException e){ //database does't exist yet. } if(checkDB != null){ checkDB.close(); } return checkDB != null ? true : false;
} /**
* Copies your database from your local assets-folder to the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException{ //Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db
String outFileName = DB_PATH + DB_NAME; //Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
} //Close the streams
myOutput.flush();
myOutput.close();
myInput.close(); } public void openDataBase() throws SQLException{ //Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override
public synchronized void close() { if(myDataBase != null)
myDataBase.close(); super.close(); } @Override
public void onCreate(SQLiteDatabase db) { } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } // Add your public helper methods to access and get content from the database.
// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
// to you to create adapters for your views. }

就这样。

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

下面是示范代码:

 ...

        DataBaseHelper myDbHelper = new DataBaseHelper();
myDbHelper = new DataBaseHelper(this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { myDbHelper.openDataBase(); }catch(SQLException sqle){ throw sqle; } ...

在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. cesium primitive方式 ————http://blog.sina.com.cn/s/blog_15e866bbe0102y0ji.html

    Cesium学习笔记-工具篇17-PrimitivePoint自定义渲染-点 (2018-08-28 16:12:06) 转载▼ 标签: cesium primitive 自定义渲染 shader c ...

  2. lua之链表的实现

    -- lua链表的实现 node = {} list = node --初始化,构建一个空表 function init() list.data = --我将头结点的数据域存放链表的长度,以免浪费空间 ...

  3. CE工具里自带的学习工具--第六关

    这一步原理: 相当于有一个变量 int a=100; int *p=&a; 点击修改值, 在ce工具里可以找到a的值.  a的地址. 但是在实际代码里,并不是这么处理的,  是 通过指针改变这 ...

  4. GET方法与POST方法的区别

    区别一:get重点在从服务器上获取资源,post重点在向服务器发送数据: 区别二:get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?" ...

  5. 计算机中的CPU

    今天写一下计算机中最核心的一部分,就是计算机的大脑---CPU.CPU也就是中央处理器(Central Processing Unit).中央处理器是一块超大规模的集成电路,是一台计算机的运算核心(C ...

  6. swiper实现响应式全屏自动轮播

    html: <!--轮播 --> <div class="Excellent_swi"> <div class="swiper-contai ...

  7. 【thinking in java】ArrayList源码分析

    简介 ArrayList底层是数组实现的,可以自增扩容的数组,此外它是非线程安全的,一般多用于单线程环境下(Vector是线程安全的,所以ArrayList 性能相对Vector 会好些) Array ...

  8. laravel学习笔记2--表单

    一.Controller 1.Request 1.1.取值:input // 1.取值 echo $request->input('name'); // 2.取不到值时打印默认值 echo $r ...

  9. Linux命令学习(4):gzip压缩与解压

    版权声明:本文为博主原创文章,未经允许不得转载 引子 gzip是Linux系统中最常用也是高效的压缩压缩命令.早期Linux系统中主要使用compress命令压缩,得到后缀为“.Z”的压缩文件,但是后 ...

  10. 微信sdk 签名

    <?php namespace app\wechat\service; use think\Config; class Signature { protected $appId ; protec ...