Android应用如何使用已有的SQLite数据库

我在做一款小游戏的时候遇到一个问题,需要使用到一个事先定义好的数据表格,然后找到了一个解决办法。

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

这里要讲到的是,如何使用你自己的存储在“assets”文件夹下的SQLite数据库,即怎样将你准备好的数据库复制到你Android程序的系统数据库路径下,从而让SQLiteDatabase API能够正常的读取它。

1. 准备SQLite database文件
假设你已经创建了一个sqlite数据库,我们需要对其进行一些修改。
(译者注:这里原文是推荐了一个SQLite数据库管理软件,这个我觉得可以随自己的喜好,最Windows下面有多款可视化的SQlite数据库管理软件,可以方便的读取,编辑数据库,例如我用的是sqlitestudio
打开数据库,添加一个新的table “android_metadata”,插入一行数据,具体的SQL如下:

----译注:如果报错无法打开数据库,请跳过这段SQL代码
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')  
INSERT INTO "android_metadata" VALUES ('en_US')

(Code问答注:上面两行是表明需要进行的操作,具体可以直接在sqlitesstudio中完成)
然后你需要对你数据表格的primary id 列重命名为 “_id”,这样Adroid会知道怎么对id列进行绑定,你可以很容易的在SQlite数据库管理软件中进行列编辑。
这两步之后,你的sqlite数据库文件就准备好了。
(译者注:这里我保留了id列,即没有对其进行重命名,测试证明也是没有问题的)

2. 在你的Android程序中复制,打开以及访问数据库
现在把你上一步准备好的数据库文件放在“assets”文件夹下面,然后通过继承 SQLiteOpenHelper类来创建一个Database Helper类,
你的DataBaseHelper类大致可以如下:
PS. 代码有点长,各式不太友好,建议直接copy出来阅读:|

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

By Code问答,参考reigndesign.com

发表评论

电子邮件地址不会被公开。 必填项已用*标注

48 − = 40