忙碌了一天,总算摸清了里面的套路与步骤,现总结如下:
首先我们要知道,安卓是无法直接操作项目某个文件夹下的SQLite数据库的,因此我们首先得把数据库移到移动设备上/data/data/你的包名/databases文件夹下,安卓自己创建的数据库也是放在这个地方。
第一步,检查你项目res目录下是否有raw文件夹,没有的话就自己新建一个,如下所示:
第二步, 将想要移动的数据库放进raw目录下,如下:第三步,将数据库移动到目标文件夹下,代码如下:
package com.example.edm;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Environment;
import android.util.Log;
public class MyDatabaseHelper {
private final int BUFFER_SIZE = 500000;
public static final String DB_NAME = "single18.db"; //保存的数据库文件名
public static final String PACKAGE_NAME = "com.example.edm";//包名
public static final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME + "/databases"; //存放数据库的位置
String dbfile=DB_PATH+"/"+DB_NAME;
private SQLiteDatabase database;
private Context context;
public MyDatabaseHelper(Context context){
this.context = context;
}
public void openDatabase() {
File dFile=new File(DB_PATH);//判断路径是否存在,不存在则创建路径
if (!dFile.exists()) {
dFile.mkdir();
}
this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
}
private SQLiteDatabase openDatabase(String dbfile) {
try {
if (!(new File(dbfile).exists())) {
InputStream is = this.context.getResources().openRawResource(
R.raw.single18); //想要导入的数据库在这里
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
null);
return db;
}catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
return null;
}
public void closeDatabase() {
this.database.close();
}
}
这里有个值得注意的地方,就是db文件命名的时候要写成英文,否则使用R.raw.db_name时会找不到该文件,我也不知道怎么回事。。。
调用:
myDatabaseHelper=new MyDatabaseHelper(SingleSubjectActivity.this);
myDatabaseHelper.openDatabase();
myDatabaseHelper.closeDatabase();
这样就将single18.db移到了/data/data/packagename/databases下,这里要注意,由于是在真机调试的情况下完成该操作的,事后可能你在目标文件夹下是找不到db文件的,得先停止调试,然后重新调试,进入Device File Exploer才能看见新导入的db文件。本人操作时就遇到了这种情况,我一直以为没有移动成功,一直调试。。白白浪费了时间。这里之所以说可能找不到,是因为可能我的代码有点问题。
最后,就可以用SQLiteOpenHelper等专用类对该数据库文件进行操作了,不再赘述。