我需要一个我正在开发的游戏的意大利语单词列表,但我实际上无法让它从资产中复制我的数据库。我尝试了很多我在网站上找到的解决方案,例如:
但是我没有运气,它继续在线上给我this error
os.write(buffer, 0, len);
但我不明白为什么。这是我正在使用的function's code和constants。 奇怪的是,我的数据库在11.45MB之后停止复制,距离目标只有1 MB。
有人可以帮我解决这个问题吗?非常感谢:))
答案 0 :(得分:4)
首先,默认资产文件夹支持db文件的最大大小为1mb。
您需要将数据库划分为多个部分。
Download HJSplit并将您的数据库分成小部分 比如13MB =每个1MB的13个部分。
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();
}
答案 1 :(得分:4)
使用SQLiteAssetHelper
,它有一个调试版本的数据库与应用程序逻辑,所以你不需要自己搞乱任何一个。
答案 2 :(得分:2)
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();
}
答案 3 :(得分:1)
我知道这已经得到了解答,但我在创建测试时遇到了类似的问题,我希望在其中存储一个特定数据库,其中包含错误以测试错误数据。问题是资产中根本找不到测试数据库。甚至看到它我必须这样做:
InputStream is = mContext.createPackageContext("com.activities.tests", Context.CONTEXT_IGNORE_SECURITY).getAssets().open("mydb.db");
忽略安全性,您可以看到它,然后获取输入流并将其保存到外部目录。