我正在创建一个使用现成的SQLiteDatabase
的应用程序。我正在给用户选择将数据库复制到SD卡或手机内存中。将数据库复制到手机内存时,以下代码可以很好地工作。 26.5 MB数据库完全复制到手机内存中。但是,如果使用相同的代码复制SD卡,则只复制数据库的一部分,即只复制名为android_metadata
的一个表。复制到SD卡时数据库部分复制
private void copyDatabase(String storage) {
try {
//DB_NAME is defined in the class
//DB_PATH refers to the phone directory path.
InputStream in = myContext.getAssets().open(DB_NAME);
File sd = Environment.getExternalStorageDirectory();
File sdCardPath = new File(sd, DB_NAME);
File phonePath = new File(DB_PATH + DB_NAME);
OutputStream os = null;
if (storage.equalsIgnoreCase("sd"))
os = new FileOutputStream(sdCardPath);
else if (storage.equalsIgnoreCase("phone"))
os = new FileOutputStream(phonePath);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
os.flush();
os.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
问题是,虽然数据库是在SD卡内存中创建的,但是不会复制完整的数据库。这样创建的数据库只有3.4 Mb的大小,而原始数据库的大小是26.5 Mb,我通过Eclipse中的文件资源管理器视图检查了这个数据库的大小。
有什么建议吗?
编辑: 由于我直接从assets
文件夹复制数据库,我才能获取FileInputStream
或FileChannel
对象。我只能从assets
资源中获得一个InputStream
对象。
我搜索了谷歌并偶然发现了您提供的链接。但两个问题的区别在于我直接从'assets'文件夹复制数据库,因此无法获得'FileInputStream'。另一方面,另一个问题从手机存储器复制数据。 – Rajat
哦,好吧,我会试着回答一些问题,并且会回来 –