我需要一个我正在开发的游戏的意大利语单词列表,但我实际上不能让它从资产中复制我的数据库。我尝试了很多在网站上找到的解决方案,例如:
但是我没有运气,它一直在给我这个错误就行了
os.write(buffer, 0, len);
但我不明白为什么。这是函数的代码和我正在使用的常量。一个奇怪的问题是我的数据库在 11.45MB 之后停止复制,距离目标只有 1MB。
有人可以帮我解决这个问题吗?非常感谢 :)
首先,默认资产文件夹支持 db 文件的最大大小为 1mb。
您需要将数据库分成几部分。
下载HJSplit并将您的数据库分成小部分,例如 13MB = 13 个部分,每个 1MB。
demoDB.sqlitedb = 13MB 然后
demodb..sqlitedb.001
demodb..sqlitedb.002
demodb..sqlitedb.003
demodb..sqlitedb.004
...
...
demodb..sqlitedb.013
然后使用以下代码合并您的数据库。
private void copyDataBase() throws IOException {
AssetManager am = mContext.getAssets();
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
byte[] b = new byte[1024];
String[] files = am.list("");
Arrays.sort(files);
int r;
for (int i = 1; i <= 9; i++) {
InputStream is = am.open("demoDB.sqlitedb.00" + i);
while ((r = is.read(b)) != -1) {
os.write(b, 0, r);
}
Log.i("BABY_DATABASE_HELPER", "Copying the database (part " + i
+ " of 9)");
is.close();
}
os.close();
}
Use SQLiteAssetHelper
,它有一个调试版本的 package-the-database-with-the-app 逻辑,所以你不需要自己搞砸这些。
private void copyDataBase() throws IOException {
AssetManager am = getAssets();
OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
byte[] b = new byte[1024];
String[] files = am.list("");
Arrays.sort(files);
int r;
for (int i = 1; i <=21; i++) {
InputStream is;
if ( i < 10){
System.out.println("coping file demoDB.sqlitedb.00"+i );
is = am.open("demoDB.sqlitedb.00" + i);
}else{
System.out.println("coping file demoDB.sqlitedb.0"+i );
is = am.open("demoDB.sqlitedb.0" + i);
}
while ((r = is.read(b)) != -1) {
os.write(b, 0, r);
}
is.close();
}
os.close();
}
我知道这已经得到解答,但是我在创建测试时遇到了类似的情况,我想在其中存储一个带有故障的特定数据库来测试错误的数据。问题是在资产中根本找不到测试数据库。为了看到它,我不得不这样做:
InputStream is = mContext.createPackageContext("com.activities.tests", Context.CONTEXT_IGNORE_SECURITY).getAssets().open("mydb.db");
通过忽略安全性,您可以看到它,然后获取输入流并将其保存到外部目录。