Android 无法从资产文件夹复制数据库
我正在尝试从应用程序中的“资产”文件夹复制数据库。该代码在Android 2.1/2.3上运行良好,但当我在Android 2.2设备上执行相同的代码时,会引发以下异常:Android 无法从资产文件夹复制数据库,android,sqlite,Android,Sqlite,我正在尝试从应用程序中的“资产”文件夹复制数据库。该代码在Android 2.1/2.3上运行良好,但当我在Android 2.2设备上执行相同的代码时,会引发以下异常: 09-03 15:54:09.762: I/System.out(610): File Created successfully 09-03 15:54:09.762: D/asset(610): Data exceeds UNCOMPRESS_DATA_MAX (4640768 vs 1048576) 09-03 15:54
09-03 15:54:09.762: I/System.out(610): File Created successfully
09-03 15:54:09.762: D/asset(610): Data exceeds UNCOMPRESS_DATA_MAX (4640768 vs 1048576)
09-03 15:54:09.762: W/System.err(610): java.io.IOException
09-03 15:54:09.782: W/System.err(610): at android.content.res.AssetManager.readAsset(Native Method)
09-03 15:54:09.782: W/System.err(610): at android.content.res.AssetManager.access$700(AssetManager.java:36)
09-03 15:54:09.862: D/dalvikvm(610): GC_FOR_MALLOC freed 2198 objects / 260688 bytes in 71ms
09-03 15:54:09.862: W/System.err(610): at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571)
09-03 15:54:09.862: W/System.err(610): at com.emobi.metro.Help.createDatabase(Help.java:39)
09-03 15:54:09.862: W/System.err(610): at com.emobi.metro.Help.<init>(Help.java:22)
09-03 15:54:09.862: W/System.err(610): at com.emobi.metro.Fair.onCreate(Fair.java:41)
09-03 15:54:09.862: W/System.err(610): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-03 15:54:09.862: W/System.err(610): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
09-03 15:54:09.862: W/System.err(610): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-03 15:54:09.862: W/System.err(610): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-03 15:54:09.862: W/System.err(610): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-03 15:54:09.862: W/System.err(610): at android.os.Handler.dispatchMessage(Handler.java:99)
09-03 15:54:09.862: W/System.err(610): at android.os.Looper.loop(Looper.java:123)
09-03 15:54:09.862: W/System.err(610): at android.app.ActivityThread.main(ActivityThread.java:4627)
09-03 15:54:09.862: W/System.err(610): at java.lang.reflect.Method.invokeNative(Native Method)
09-03 15:54:09.862: W/System.err(610): at java.lang.reflect.Method.invoke(Method.java:521)
09-03 15:54:09.862: W/System.err(610): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-03 15:54:09.862: W/System.err(610): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-03 15:54:09.862: W/System.err(610): at dalvik.system.NativeStart.main(Native Method)
是的,我也试过了,但后来我遇到了以下异常
09-03 16:14:26.652:E/AndroidRuntime(2165):java.lang.RuntimeException:无法启动活动组件信息{com.emobi.metro/com.emobi.metro.Fair}:android.database.sqlite.SQLiteException:没有这样的表:Fair:,编译时:从Fair中选择电台
在数据库中提供。在web上可以找到许多可能的解决方案,下面是关于stackoverflow的一个很好的讨论:
这似乎与android压缩超过1MB的文件有关。您的数据超过1MB 在这种情况下,只需将数据库名称重命名为dbname.mp3
private void copyDataBase() throws IOException {
try {
// Open your local db as the input stream
InputStream myInput = context.getAssets().open("databases/" + DB_NAME + ".mp3");
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
} catch (Exception e) {
Log.e("Error in copy DB", e.toString());
}
}
真正用winzip压缩数据库并将其放入资产文件夹,在运行时解压缩并复制到数据库文件夹
private void copyDataBase() throws IOException {
try {
// Open your local db as the input stream
InputStream myInput = context.getAssets().open("databases/" + DB_NAME + ".mp3");
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
} catch (Exception e) {
Log.e("Error in copy DB", e.toString());
}
}