2016-04-15 9 views
0

Meine App SQLiteAssetHelper verwendet mit vorinstallierten database.but zu arbeiten, wenn ich mit Datenbank, die die App Kraft closes.This arbeiten will, ist die logcat:SQLiteAssetHelper kippt Datenbank lesen oder schreiben

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) 

und dies ist SQLiteAssetHelper Klasse:

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

    } 

und das ist der Teil der Aktivität liest und schreibt Datenbank:

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

Ich erwarte Ihre wertvollen Führer. BTW , könnte Android Studio nicht lösen com.readystatesoftware.sqliteasset.SQLiteAssetHelper so hinzugefügt ich es manuell in libs Ordner (i dies gesagt, vielleicht ist erforderlich)

+0

'Fehlende Datenbanken/meinDBName.db.zip Datei in Assets oder Zielordner nicht beschreibbar' - haben Sie die verpackte Datenbank an Ort und Stelle in der Fehlermeldung erwähnt? Im Hinblick auf Android Studio enthält [die 'SQLiteAssetHelper'-Dokumentation Anweisungen zum Hinzufügen der' compile'-Anweisung zu Ihrer 'app/build.gradle' Datei] (https://github.com/jgilfelt/android-sqlite-asset-helper #Konfiguration). Siehe auch [diese Beispiel-App von mir] (https://github.com/commonsguy/cw-omnibus/tree/master/Database/ConstantsAssets-AndroidStudio), die 'SQLiteAssetHelper' verwendet. – CommonsWare

+0

@ CommonWare.was meinst du "paketierte Datenbank"? – mohamad

+0

@ CommonWare. Ich habe gezippte db zu den Datenbanken unter Asset-Ordner hinzugefügt. – mohamad

Antwort

0

Dieses Problem finally.The sqlAssetHelper Lib-Datei gelöst wurde, wurde eine alte Version so ersetzte ich mit neuen one.now arbeitet fließend.das ist der Asset-Helfer, der das Problem gelöst hat: updated asset helper