2016-04-15 56 views
0

我的應用程序使用SQLiteAssetHelper用時,我想用數據庫工作應用力closes.This預裝的database.but工作是logcat的:SQLiteAssetHelper不能讀取或寫入數據庫

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())); 

我期待您的寶貴指導。 BTW,AndroidStudio無法解析com.readystatesoftware.sqliteasset.SQLiteAssetHelper 所以我說這將手動libs文件夾中(我告訴本報,也許需要)

+0

'資產中的數據庫/ myDBName.db.zip文件丟失或目標文件夾中的文件不可寫 - - 您是否具有打包的數據庫在錯誤信息中提到?在Android Studio方面,['SQLiteAssetHelper'文檔有將'compile'語句添加到'app/build.gradle'文件的說明](https://github.com/jgilfelt/android-sqlite-asset-helper #建立)。另請參閱[我的示例應用程序](https://github.com/commonsguy/cw-omnibus/tree/master/Database/ConstantsAssets-AndroidStudio),它使用'SQLiteAssetHelper'。 – CommonsWare

+0

@ CommonWare.what你的意思是「打包的數據庫」? – mohamad

+0

@ CommonWare.I已將壓縮數據庫添加到資產文件夾下的數據庫。 – mohamad

回答

0

這個問題已經解決finally.The sqlAssetHelper LIB文件的舊版本,所以我更換新的one.now正在流利地工作。這是解決問題的資產幫手:updated asset helper