Android 无法从资产文件夹复制数据库

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

我正在尝试从应用程序中的“资产”文件夹复制数据库。该代码在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.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());

        }

    }