SQLiteAssetHelper无法读取或写入数据库

时间:2016-04-15 12:21:20

标签: android sqlite

我的应用正在使用SQLiteAssetHelper来处理预加载的数据库。但是当我想要使用数据库时,应用程序强制关闭。这是logcat:

   04-15 16:40:48.924  10976-10976/max.mzf.com.max E/SQLiteAssetHelper﹕ Couldn't open myDBName.db for writing (will try read-only):
    com.readystatesoftware.sqliteasset.SQLiteAssetException: Missing databases/myDBName.db.zip file in assets or target folder not writable
            at android.content.res.AssetManager.openAsset(Native Method)
            at android.content.res.AssetManager.open(AssetManager.java:299)
            at android.content.res.AssetManager.open(AssetManager.java:273)
            at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.copyDatabaseFromAssets(SQLiteAssetHelper.java:376)
            at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.createOrOpenDatabase(SQLiteAssetHelper.java:355)
            at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getWritableDatabase(SQLiteAssetHelper.java:178)
            at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:257)
            at max.mzf.com.max.MyDatabase.getCardCount(MyDatabase.java:158)
            at max.mzf.com.max.Compose.onCreate(Compose.java:65)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2466)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
            at android.app.ActivityThread.access$2200(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4370)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
            at dalvik.system.NativeStart.main(Native Method)
04-15 16:40:48.934  10976-10976/max.mzf.com.max E/AndroidRuntime﹕ java.lang.RuntimeException: Unable to start activity ComponentInfo{max.mzf.com.max/max.mzf.com.max.Compose}: android.database.sqlite.SQLiteException: unable to open database file
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2503)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
            at android.app.ActivityThread.access$2200(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4370)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.sqlite.SQLiteException: unable to open database file
            at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
            at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1698)
            at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739)
            at com.readystatesoftware.sqliteasset.SQLiteAssetHelper.getReadableDatabase(SQLiteAssetHelper.java:267)
            at max.mzf.com.max.MyDatabase.getCardCount(MyDatabase.java:158)
            at max.mzf.com.max.Compose.onCreate(Compose.java:65)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2466)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
            at android.app.ActivityThread.access$2200(ActivityThread.java:123)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:123)
            at android.app.ActivityThread.main(ActivityThread.java:4370)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:521)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
            at dalvik.system.NativeStart.main(Native Method)

这是SQLiteAssetHelper类:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.widget.Toast;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class MyDatabase extends SQLiteAssetHelper {
    private static final String DATABASE_NAME = "myDBName.db";
    private static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);

        // you can use an alternate constructor to specify a database location
        // (such as a folder on the sd card)
        // you must ensure that this folder is available and you have permission
        // to write to it
        //super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION);

    }

这是读取和写入数据库的活动的一部分:

import android.database.SQLException;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;

public class Compose extends AppCompatActivity  {


    TextView Count;

    MyDatabase db;
    private Globals globalVariable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newcard);
        db = new MyDatabase(this);


        Count=(TextView)findViewById(R.id.Count);



      Count.setText(String.valueOf(db.getCardCount()));

我期待你的宝贵指南。 顺便说一下,AndroidStudio无法解析com.readystatesoftware.sqliteasset.SQLiteAssetHelper 所以我手动将它添加到libs文件夹中(我告诉过这个,也许是需要的)

1 个答案:

答案 0 :(得分:0)

这个问题终于解决了.sqlAssetHelper lib文件是一个旧版本所以我换成了新版本。现在正在流利地工作。这是解决问题的资产助手:updated asset helper