在Android程序中使用已有的SQLite数据库

生也有涯,知也无涯。这篇文章主要讲述在Android程序中使用已有的SQLite数据库相关的知识,希望能为你提供帮助。
已经将这篇文章迁移至 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列,即没有对其进行重命名,測试证明也是没有问题的)
【在Android程序中使用已有的SQLite数据库】

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; } ...
















    推荐阅读