在有的时候,应用程序需要绑定一些数据库文件一起发布,毕竟不可能都从服务器读取或用户输入。解决方法之一把数据库文件放在res/raw下,然后一运行程序就判断是否存在数据库表不存在则通过输入输出流复制raw下的数据库文件到手机中.代码如下
package com.ts.first;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* (/data/data/...)这种不被推荐,eclipse会警告你的,
* 我是这么得到数据库路径的,但是我这么得到的是/data/data/com
* .ts.first/databases/sqlite.db,所以要进行修改)
*/
String DB_PATH = getDatabasePath("sqlite.db").toString();
String DB_Dir = DB_PATH.substring(0, DB_PATH.lastIndexOf("/")) + "/";
// 最后得到的是/data/data/com.ts.first/databases/,这正是我们所需要的
String[] path = { DB_PATH, DB_Dir };
// 如果数据库不存在,执行异步任务创建之
if (!isDataBaseExist(DB_PATH)) {
FirstAsyncTask firstAsyncTask = new FirstAsyncTask();
firstAsyncTask.execute(path);
}
}
// 在这里使用使用异步操作去将文件复制到/data/data/com.ts.first/databases/,就达到了我们的目的
public class FirstAsyncTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... path) {
File file = new File(path[1]);
// 如果文件不存在,创建之
if (!file.exists()) {
file.mkdir();
}
FileOutputStream os = null;
try {
os = new FileOutputStream(path[0]);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 得到数据库文件的写入流
InputStream is = MainActivity.this.getResources().openRawResource(
R.raw.sqlite);
// 得到数据库文件的数据流
byte[] buffer = new byte[8192];
int count = 0;
try {
while ((count = is.read(buffer)) > 0) {
os.write(buffer, 0, count);
os.flush();
}
is.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
// 判断数据库是否存在
public boolean isDataBaseExist(String path) {
SQLiteDatabase sqLiteDatabase = null;
try {
/*
* 以只读方式打开数据库。在不知道磁盘已满是否已满的情况下,这是唯一可靠的方式来打开数据库。(官方API是这样描述的 )
*/sqLiteDatabase = SQLiteDatabase.openDatabase(path, null,
SQLiteDatabase.OPEN_READONLY);
} catch (Exception e) {
}
if (sqLiteDatabase != null)
sqLiteDatabase.close();
return sqLiteDatabase != null ? true : false;
}
}