设为首页 加入收藏

TOP

如何在Android应用中使用已有的SQLite数据库(一)
2014-11-24 08:05:36 来源: 作者: 【 】 浏览:0
Tags:何在 Android 应用 使用 有的 SQLite 数据库

其主要思路是:


1. 把数据库分解成几个asset文件。


2. 当需要打开数据库时,如果数据库不存在,就把那几个asset文件重新合并成一个数据库文件。


3. 如果数据库的版本改变了,就在onUpgrade()方法中把数据库文件删除掉。



下面是代码:



//数据库的缺省路径


private static finalString DB_PATH = "/data/data/com.mypackage.myapp/databases/";


private static finalString DB_NAME = "mydb.db";


private static finalint DB_VERSION = 2;


private static finalString DB_SPLIT_NAME = "mydb.db.00";


private static finalint DB_SPLIT_COUNT = 3;


private SQLiteDatabasem_database;


private final Contextm_context;


/**


* Constructor


*保存传进来的context参数以用来访问应用的asset和资源文件。


* @param context


*/


public MyDB(Contextcontext) {


super(context, DB_NAME, null, DB_VERSION);


this.m_context = context;


}


public static MyDBopenDatabaseReadOnly(Context context) {


MyDB db = new MyDB(context);



try {


db.createDataBase();


} catch (IOException e) {


// TODO Auto-generated catch block


e.printStackTrace();


}



db.openDataBase(SQLiteDatabase.OPEN_READONLY);


return db;


}


public static MyDBopenDatabaseReadWrite(Context context) {


MyDB db = new MyDB(context);



try {


db.createDataBase();


} catch (IOException e) {


// TODO Auto-generated catch block


e.printStackTrace();


}



db.openDataBase(SQLiteDatabase.OPEN_READWRITE);


return db;


}


/**


*创建一个空数据库,用来存储你已有的数据库。


*/


public voidcreateDataBase() throws IOException{


boolean dbExist =checkDataBase();


if (dbExist) {


/*


**如果你的数据库的版本改变了,调用这个方法确保在onUpgrade()被调用时


**传进去的是可写的数据库。


*/


SQLiteDatabase db =this.getWritableDatabase();



if (db != null) {


db.close();


}


}



dbExist = checkDataBase();



if (!dbExist) {


try {


/*


** 调用这个方法以确保在缺省路径内产生一个空数据库,以便在其基础上复制我们已有的数据库。


*/


SQLiteDatabase db =this.getReadableDatabase();



if (db != null) {


db.close();


}


copyDataBase();


}


catch (IOException e) {


Log.e("DB", e.getMessage());


throw new Error("Error copyingdatabase");


}


}


}


/**


* 检查数据库是否已存在,以避免重复复制。


* @return true if it exists, false if itdoesn't


*/


private static booleancheckDataBase(){


SQLiteDatabase checkDB = null;


try {


String path = DB_PATH + DB_NAME;


checkDB =SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);


}


catch (SQLiteException e){


//database does't exist yet.


}


if (checkDB != null) {


checkDB.close();


}


return checkDB != null true : false;


}


/**


* 把存在asset文件中的数据库复制的刚创建的空数据库中。


* */


private voidcopyDataBase() throws IOException {


// 刚创建的空数据库的路径


String outFileName = DB_PATH + DB_NAME;


// 打开空数据库


OutputStream output = new FileOutputStream(outFileName);



byte[] buffer = new byte[1024*8];



AssetManager assetMgr =m_context.getAssets();



for (int i = 1; i <= DB_SPLIT_COUNT; i++){


// 打开分解的asset文件


String fn = DB_SPLIT_NAME +String.valueOf(i);


InputStream input = assetMgr.open(fn);


//Log.i("DB", "opened" + fn);



int length;


while ((length = input.read(buffer)) >0) {


//Log.i("DB", "read" + String.valueOf(length));


output.write(buffer, 0, length);


//Log.i("DB", "write" + String.valueOf(length));


}


input.close();


}



//Close the streams


output.flush();


output.close();


}



/**


* 打开数据库。


* */


private voidopenDataBase(int flags) throws SQLException{


//Open the database


String myPath = DB_PATH + DB_NAME;


m_database =SQLiteDatabase.openDatabase(myPath, null, flags);


}



/**


* 关闭数据库。


* */


@Override


public synchronizedvoid close() {


if (m_database != null)


m_database.close();


super.close();


}


}



@Override


public voidonCreate(SQLiteDatabase db) {


// 不

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android系统详解之获取图片和视频.. 下一篇Linux 静态库的创建和使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Bash 脚本教程——Li (2025-12-26 07:53:35)
·实战篇!Linux shell (2025-12-26 07:53:32)
·整理了250个shell脚 (2025-12-26 07:53:29)
·HyperText Transfer (2025-12-26 07:20:48)
·半小时搞懂 HTTP、HT (2025-12-26 07:20:42)