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

来源:本站
导读:目前正在解读《在Android程序中使用已有的SQLite数据库》的相关信息,《在Android程序中使用已有的SQLite数据库》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《在Android程序中使用已有的SQLite数据库》的详细说明。
简介:在大多数的Android示例或是教程中,都是假设你需要在程序运行的时候创建一个数据库并插入新的数据,而不是使用一个独立的提前读取的数据库。

在中文搜索中,没有找到一篇比较好的关于如何在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,按照它的步骤,测试成功,决定把这篇文章大致的翻译一下,在overstack的一些解答中,也是直接引用了这篇文章。分享给有需要的同学。

译文:

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

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

1. 准备SQLite database文件

假设你已经创建了一个sqlite数据库,我们需要对其进行一些修改。

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

打开数据库,添加一个新的table “android_metadata",插入一行数据,具体的SQL如下:

123CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')INSERT INTO "android_metadata" VALUES ('en_US')

(译者注:上面两行是表明需要进行的操作,具体可以直接在sqlitesstudio中完成)

然后你需要对你数据表格的primary id 列重命名为 “_id”,这样Adroid会知道怎么对id列进行绑定,你可以很容易的在SQlite数据库管理软件中进行列编辑。

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

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

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

现在把你上一步准备好的数据库文件放在“assets”文件夹下面,然后通过继承 SQLiteOpenHelper类来创建一个Database Helper类,

你的DataBaseHelper类大致可以如下:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140public 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 streamInputStream myInput = myContext.getAssets().open(DB_NAME);// Path to the just created empty dbString outFileName = DB_PATH + DB_NAME;//Open the empty db as the output streamOutputStream myOutput = new FileOutputStream(outFileName);//transfer bytes from the inputfile to the outputfilebyte[] buffer = new byte[1024];int length;while ((length = myInput.read(buffer))>0){myOutput.write(buffer, 0, length);}//Close the streamsmyOutput.flush();myOutput.close();myInput.close();}public void openDataBase() throws SQLException{//Open the databaseString myPath = DB_PATH + DB_NAME;myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);}@Overridepublic synchronized void close() {if(myDataBase != null)myDataBase.close();super.close();}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic 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)

以下是示范代码:

1234567891011121314151617181920212223242526...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数据库》最后刷新时间 2024-03-14 01:05:43,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《在Android程序中使用已有的SQLite数据库》该内容的真实性请自行鉴别。