android.database.sqlite.SQLiteCantOpenDatabaseException: erreur inconnue (code 14): impossible d’ouvrir la firebase database

J’ai lu divers articles sur ce sujet mais je ne suis pas capable de le comprendre. J’utilise une firebase database de pré-compilation pour cette application. J’utilise jellybean pour cette application.

AndroidManifest.xml

            

Sortie Logcat

Selon logcat, il est causé par SQLiteCantOpenDatabaseException

 06-10 23:07:01.831: E/Trace(4419): error opening trace file: No such file or directory (2) 06-10 23:07:03.611: E/SQLiteLog(4419): (14) cannot open file at line 30176 of [00bb9c9ce4] 06-10 23:07:03.621: E/SQLiteLog(4419): (14) os_unix.c:30176: (2) open(/data/data/com.example.quotes/databasesQuotesdb) - 06-10 23:07:03.641: E/SQLiteDatabase(4419): Failed to open database '/data/data/com.example.quotes/databasesQuotesdb'. 06-10 23:07:03.641: E/SQLiteDatabase(4419): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at com.example.quotes.DataBaseHelper.checkDataBase(DataBaseHelper.java:94) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at com.example.quotes.DataBaseHelper.createDataBase(DataBaseHelper.java:58) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at com.example.quotes.MainActivity.onCreate(MainActivity.java:34) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.Activity.performCreate(Activity.java:5104) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.ActivityThread.access$600(ActivityThread.java:141) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.os.Handler.dispatchMessage(Handler.java:99) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.os.Looper.loop(Looper.java:137) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at java.lang.reflect.Method.invokeNative(Native Method) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at java.lang.reflect.Method.invoke(Method.java:511) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-10 23:07:03.641: E/SQLiteDatabase(4419): at dalvik.system.NativeStart.main(Native Method) 06-10 23:07:03.731: E/SQLiteLog(4419): (14) cannot open file at line 30176 of [00bb9c9ce4] 06-10 23:07:03.731: E/SQLiteLog(4419): (14) os_unix.c:30176: (2) open(/data/data/com.example.quotes/databasesQuotesdb) - 06-10 23:07:03.781: E/SQLiteDatabase(4419): Failed to open database '/data/data/com.example.quotes/databasesQuotesdb'. 06-10 23:07:03.781: E/SQLiteDatabase(4419): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at com.example.quotes.DataBaseHelper.openDataBase(DataBaseHelper.java:145) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at com.example.quotes.MainActivity.onCreate(MainActivity.java:44) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.Activity.performCreate(Activity.java:5104) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.ActivityThread.access$600(ActivityThread.java:141) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.os.Handler.dispatchMessage(Handler.java:99) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.os.Looper.loop(Looper.java:137) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at java.lang.reflect.Method.invokeNative(Native Method) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at java.lang.reflect.Method.invoke(Method.java:511) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-10 23:07:03.781: E/SQLiteDatabase(4419): at dalvik.system.NativeStart.main(Native Method) 06-10 23:07:03.791: D/AndroidRuntime(4419): Shutting down VM 06-10 23:07:03.791: W/dalvikvm(4419): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 06-10 23:07:03.831: E/AndroidRuntime(4419): FATAL EXCEPTION: main 06-10 23:07:03.831: E/AndroidRuntime(4419): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.quotes/com.example.quotes.MainActivity}: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread.access$600(ActivityThread.java:141) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.os.Handler.dispatchMessage(Handler.java:99) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.os.Looper.loop(Looper.java:137) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread.main(ActivityThread.java:5041) 06-10 23:07:03.831: E/AndroidRuntime(4419): at java.lang.reflect.Method.invokeNative(Native Method) 06-10 23:07:03.831: E/AndroidRuntime(4419): at java.lang.reflect.Method.invoke(Method.java:511) 06-10 23:07:03.831: E/AndroidRuntime(4419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 06-10 23:07:03.831: E/AndroidRuntime(4419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 06-10 23:07:03.831: E/AndroidRuntime(4419): at dalvik.system.NativeStart.main(Native Method) 06-10 23:07:03.831: E/AndroidRuntime(4419): Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669) 06-10 23:07:03.831: E/AndroidRuntime(4419): at com.example.quotes.DataBaseHelper.openDataBase(DataBaseHelper.java:145) 06-10 23:07:03.831: E/AndroidRuntime(4419): at com.example.quotes.MainActivity.onCreate(MainActivity.java:44) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.Activity.performCreate(Activity.java:5104) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 06-10 23:07:03.831: E/AndroidRuntime(4419): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 06-10 23:07:03.831: E/AndroidRuntime(4419): ... 11 more 06-10 23:07:04.083: D/dalvikvm(4419): GC_CONCURRENT freed 203K, 11% free 2676K/3000K, paused 25ms+18ms, total 306ms 06-10 23:07:07.811: I/Process(4419): Sending signal. PID: 4419 SIG: 9 

DataBaseHelper.java

 public class DataBaseHelper extends SQLiteOpenHelper{ //The Android's default system path of your application database. private static Ssortingng DB_PATH = "/data/data/com.example.quotes/databases"; private static Ssortingng DB_NAME = "Quotesdb"; // Table Names of Data Base. static final Ssortingng TABLE_Name = "Quotes"; // Contacts Table Columns names //private static final Ssortingng _Id = "_Id"; //private static final Ssortingng quotes = "quotes"; //private static final Ssortingng author = "author"; private SQLiteDatabase myDataBase; private final Context myContext; /** * Constructor * Takes and keeps a reference of the passed context in order to access to the application assets and resources. * @param context */ public DataBaseHelper(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; } /** * Creates a empty database on the system and rewrites it with your own database. * */ public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); SQLiteDatabase db_Read = null; if(dbExist){ //do nothing - database already exist }else{ //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. db_Read = this.getReadableDatabase(); db_Read.close(); try { copyDataBase(); } catch (IOException e) { //throw new Error("Error copying database"); e.toSsortingng(); } } } /** * Check if the database already exist to avoid re-copying the file each time you open the application. * @return true if it exists, false if it doesn't */ private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try{ Ssortingng myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); }catch(SQLiteException e){ //database does't exist yet. } if(checkDB != null){ checkDB.close(); } return checkDB != null ? true : false; } /** * Copies your database from your local assets-folder to the just created empty database in the * system folder, from where it can be accessed and handled. * This is done by transfering bytestream. * */ private void copyDataBase() throws IOException{ //Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db Ssortingng outFileName = DB_PATH + DB_NAME; //Open the empty db as the output stream 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(); } public void openDataBase() throws SQLException{ //Open the database Ssortingng myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override public synchronized void close() { if(myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } /*// Getting single contact public List getQuote(int id) { ArrayList(); getReadableDatabase(); Cursor cursor = db.query(TABLE_Name, new Ssortingng[] { _Id, qotes,author }, _Id + "=?", new Ssortingng[] { Ssortingng.valueOf(id) }, null, null, null, null); //Ssortingng query = "SELECT _Id, qotes, author From "+TABLE_Name; //Ssortingng query = "SELECT * From Quotes"; //Cursor cursor = db.rawQuery(query, null); if (cursor != null) cursor.moveToFirst(); Quotes quotes = new Quotes(Integer.parseInt(cursor.getSsortingng(0)), cursor.getSsortingng(1),cursor.getSsortingng(2)); QuoteList.add(quotes); return QuoteList; } */ } 

Ajoutez cette autorisation au fichier AndroidManifest.xml votre projet, dans la balise manifest (qui doit être la balise de premier niveau).

  

Remplacez le code checkDataBase () par le code ci-dessous:

 File dbFile = myContext.getDatabasePath(DB_NAME); return dbFile.exists(); 

Vous pouvez rencontrer ce problème si vous exécutez votre application sur Android Marshmallow ou une version ultérieure (API niveau 23 ou supérieur), en raison du nouveau modèle d’permissions en temps réel introduit dans cette application.

À partir d’Android 6.0 (niveau 23 de l’API), les utilisateurs accordent des permissions aux applications lorsque l’application est en cours d’exécution, et non lors de l’installation de l’application. Cette approche rationalise le processus d’installation de l’application, car l’utilisateur n’a pas besoin d’accorder d’permissions lorsqu’il installe ou met à jour l’application.

Pour obtenir des permissions à l’exécution, vous devrez demander à l’utilisateur. Vous pouvez le faire de la manière suivante.

Première demande d’autorisation.

 Ssortingng[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; requestPermissions(permissions, WRITE_REQUEST_CODE); 

Et puis vous pouvez vérifier les résultats dans

 @Override public void onRequestPermissionsResult(int requestCode, Ssortingng permissions[], int[] grantResults) { switch (requestCode) { case WRITE_REQUEST_CODE: if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ //Permission granted. //Continue with writing files... } else{ //Permission denied. } break; } } 

Voici une bonne source d’apprentissage demandant-runtime-permissions-dans-androïde-guimauve /

Cela peut être dû à de mauvaises permissions ou à SELinux. Assurez-vous que les permissions et le propriétaire / groupe sont correctement définis. Ensuite, lancez ceci:

 restorecon /data/data/your.app.folder/databases/your.db 

restorecon restaure le contexte de sécurité SELinux par défaut du fichier

Je pense que c’est parce que votre DB_Path termine sans un “/”. Lorsque vous concaténez le chemin d’access avec la firebase database, la variable myPath contient la chaîne suivante: "/data/data/com.example.quotes/databasesQuotesdb" .

Je propose ces changements:

 private static Ssortingng DB_PATH = "/data/data/com.example.quotes/databases/"; private static Ssortingng DB_NAME = "Quotesdb.db"; 

Et une autre chose, vous devez ouvrir la firebase database dans l’activité principale et implémenter les onPause() et onResume() avec database.close() et database.open() respectivement. Ceci est mon exemple pour l’activité principale (utilisée avec Cordova, conception de sites Web et tout le rest = P):

 package home.shell.accessApp; import android.os.Bundle; import android.util.Log; import org.apache.cordova.*; public class AccessApp extends CordovaActivity { private SellitDAO db; //This is the class name for my SQLiteOpenHelper @Override public void onCreate(Bundle savedInstanceState) { db = new SellitDAO(this); db.open(); super.onCreate(savedInstanceState); super.init(); // Set by  in config.xml super.loadUrl(Config.getStartUrl()); //super.loadUrl("file:///android_asset/www/index.html") } @Override public void onPause() { super.onPause(); db.close(); } @Override public void onResume() { super.onResume(); db.open(); } } 

Bonne chance!!!

Le DB_PATH pointait vers une firebase database différente. Changez-le en classe d’assistance de firebase database et mon code fonctionne.

 private static Ssortingng DB_PATH = "/data/data/com.example.abc"; 

Je ne pense pas que ce soit votre problème, mais ça me semble toujours mauvais. Vous avez une couche dupliquée de com.examples.quote dans votre projet. Votre section d’activité dans votre fichier AndroidManifest.xml devrait ressembler davantage à ceci:

        

Vous pouvez même avoir vos classes sous src / com.example.quotes / com.example.quotes au lieu de simplement dans com.example.quotes.

Je ne suis pas sûr que cela cause votre problème. Mais ça a l’air un peu foiré. Toutes mes autres choses me semblent plutôt standard.

@nmr vérifie également la propriété et les groupes sur le fichier sqlite lui-même … J’avais copié ma firebase database depuis / sdcard en tant que root, donc j’ai dû modifier les permissions.

 -rw-rw---- root root 180224 2014-05-05 11:06 test.sqlite 

devrait être..

 -rw-rw---- u0_a80 u0_a80 180224 2014-05-05 11:06 test.sqlite 

Utilisé les commandes suivantes pour définir la propriété et le groupe corrects. Le u0_a80 j’ai obtenu de ls -al sur d’autres fichiers du répertoire

 chown u0_a80 test.sqlite chgrp u0_a80 test.sqlite 

Mon gremlin pour ce problème était des permissions de répertoire incorrectes:

Bonnes permissions:

 drwxr-x--x u0_a20 u0_a20 2013-11-13 20:45 com.google.earth drwxr-x--x u0_a63 u0_a63 2013-11-13 20:46 com.nuance.xt9.input drwxr-x--x u0_a53 u0_a53 2013-11-13 20:45 com.tf.thinkdroid.sg drwxr-x--x u0_a68 u0_a68 2013-12-24 15:03 eu.chainfire.supersu drwxr-x--x u0_a59 u0_a59 2013-11-13 20:45 jp.co.omronsoft.iwnnime.ml drwxr-x--x u0_a60 u0_a60 2013-11-13 20:45 jp.co.omronsoft.iwnnime.ml.kbd.white drwxr-x--x u0_a69 u0_a69 2013-12-24 15:03 org.mozilla.firefox 

Mauvaises permissions:

 root@grouper:/data/data # ls -lad com.mypackage drw-rw-r-- u0_a70 u0_a70 2014-01-11 14:18 com.mypackage 

Comment ont-ils été ainsi? Je les mets de cette façon, tout en essayant d’essayer de faire adb pull . Clairement, je l’ai mal fait.

Hé, Google, ce serait vraiment bien si une erreur de permission produisait un message d’erreur significatif, ou si cela ne fonctionnait pas si vous n’aviez pas à modifier les permissions pour utiliser les outils.

J’ai récemment eu cette erreur. Mais c’était encore plus étrange. Je travaillais sur Android N et tout allait bien, jusqu’à ce que je le teste sur JellyBeans et Lollipop. Dans lequel j’ai continué à obtenir la même erreur de firebase database.

android.database.sqlite.SQLiteCantOpenDatabaseException: erreur inconnue (code 14): impossible d’ouvrir la firebase database 06-10 23: 07: 03.641: E / SQLiteDatabase (4419):

J’avais les bonnes permissions dans mon manifeste, notamment:

  

Le problème était cette ligne dans mon DataBaseHelper.java :

 private static Ssortingng DB_PATH = "/data/data/com.example.quotes/databases"; 

qui devait être chargé à partir du contexte de cette manière:

 Ssortingng DB_PATH = getContext().getApplicationInfo().dataDir+"/databases/"; 

Maintenant fonctionne correctement sous forme de SDK 17.

Ajoutez avant OpenDatabase ces lignes:

 File outFile = new File(Environment.getDataDirectory(), outFileName); outFile.setWritable(true); SQLiteDatabase.openDatabase(outFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE); 

Comme mentionné par @CommonsWare, vous voudrez essayer android sqlite asset helper . Cela m’a fait ouvrir un db préexistant.

Je l’ai littéralement travaillé environ une demi-heure après avoir passé 3 heures à essayer de tout faire manuellement. Ce qui est drôle, c’est que je pensais faire la même chose que la bibliothèque pour moi, mais il manquait quelque chose!

La suppression des données de l’application m’a aidé. Cela peut vous aider ..

Le chemin d’access par défaut d’Android à la firebase database de votre application est / data / data / YOUR_PACKAGE / databases / YOUR_DB_NAME.

Votre logcat dit clairement Échec d’ouverture de la firebase database ‘/data/data/com.example.quotes/databasesQuotesdb’

Ce qui signifie qu’il n’y a aucun fichier présent sur le chemin donné ou que vous avez donné le mauvais chemin pour le fichier de données . Comme je peux le voir, il devrait y avoir “/” après le dossier des bases de données.

Votre variable DB_PATH devrait se terminer par un “/”.

static statique Ssortingng DB_PATH = “/data/data/com.example.quotes/databases/”;

Votre chemin correct sera maintenant “/data/data/com.example.quotes/databases/Quotesdb”

Veuillez vous assurer que vous n’essayez pas d’ouvrir et de fermer la firebase database à plusieurs resockets, à partir du thread principal ou du thread d’arrière-plan.

Créez une classe singleton dans votre application et essayez de créer et d’ouvrir uniquement les données de cette classe.

Est garanti que l’appel ouvert à la firebase database est effectué uniquement lorsqu’il n’existe pas.

Dans votre application entière, utilisez la même approche pour obtenir un object sqLiteDatabase lorsque cela est nécessaire.

J’ai utilisé le code ci-dessous et mon problème est résolu après 1,5 jours.

 ............................................................... 

Dans la classe de votre activité, la méthode onCreate ()

 public class MainActivity extends AppCompatActivity { private AssetsDatabaseHelper helper; @Override protected void onCreate(Bundle savedInstanceState) { helper = AssetsDatabaseHelper.getInstance(this); sqLiteDatabase = helper.getDatabase(); } } public class AssetsDatabaseHelper { Context context; SQLiteDatabase sqLiteDatabase; DatabaseHelper databaseHelper; private static AssetsDatabaseHelper instance; private AssetsDatabaseHelper(Context context){ this.context = context; databaseHelper = new DatabaseHelper(context); if(databaseHelper.checkDatabase()){ try{ databaseHelper.openDatabase(); }catch(SQLException sqle){ Log.e("Exception in opening ", " :: database :: sqle.getCause() : "+sqle.getCause()); } }else{ try{ databaseHelper.createDatabase(); }catch(IOException ioe){ Log.d("Exception in creating ", " :: database :: ioe.getCause() : "+ioe.getCause()); } try{ databaseHelper.openDatabase(); }catch(SQLException sqle){ Log.e("Exception in opening ", " :: database :: "+sqle.getCause()); } } sqLiteDatabase = databaseHelper.getSqLiteDatabase(); } public static AssetsDatabaseHelper getInstance(Context context){ if(instance != null){ return instance; }else { instance = new AssetsDatabaseHelper(context); return instance; } } public SQLiteDatabase getDatabase(){ return sqLiteDatabase; } }