我在 assets 文件夹中有一个 sqlite db,对于我的应用程序的第一次启动,我将它复制到路径“data/data/databases”。
这在 Gingerbread 的所有设备上都可以正常工作,但是对于旧版本,当我查询 db 时,我得到一个 table not found 异常。事实上,数据库文件夹中的 db 是空的。它只包含一个 android_metadata 表。
这是我用来复制数据库的两种方法:
public static void copyDBInMemoryIfNeeded(Context ctx, String pkgName) {
try {
String destPath = ctx.getFilesDir().getParentFile().getPath() + "/databases";
File f = new File(destPath);
if (!f.exists()) {
f.mkdirs();
f.createNewFile();
copyDBInMemory(ctx.getAssets().open("mydb.sqlite"),
new FileOutputStream(destPath));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void copyDBInMemory(InputStream inputStream, OutputStream outputStream)
throws IOException {
// ---copy 1K bytes at a time---
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
}
这里是我的 DBAdapter 类:
public class DBAdapter {
final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
public DBAdapter(Context ctx) {
this.context = ctx;
DBHelper= new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
+ ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS contacts");
onCreate(db);
}
}
public DBAdapter open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
public void close() {
DBHelper.close();
} }