web-dev-qa-db-fra.com

android.database.sqlite.SQLiteCantOpenDatabaseException: erreur inconnue (code 14): Impossible d'ouvrir la base de données

J'ai lu diverses informations sur ce sujet sur place, mais je ne suis pas en mesure de le comprendre. J'utilise la base de données pré-build pour cette application. J'utilise jellybean pour cette application.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
        package="com.example.quotes"
        Android:versionCode="1"
        Android:versionName="1.0" >

        <uses-sdk
            Android:minSdkVersion="8"
            Android:targetSdkVersion="17" />

        <application
            Android:allowBackup="true"
            Android:icon="@drawable/ic_launcher"
            Android:label="@string/app_name"
            Android:theme="@style/AppTheme" >
            <activity
                Android:name="com.example.quotes.MainActivity"
                Android:label="@string/app_name" >
                <intent-filter>
                    <action Android:name="Android.intent.action.MAIN" />

                    <category Android:name="Android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

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 String DB_PATH = "/data/data/com.example.quotes/databases";

    private static String DB_NAME = "Quotesdb";

    // Table Names of Data Base.
    static final String TABLE_Name = "Quotes";

    // Contacts Table Columns names
    //private static final String _Id = "_Id";
    //private static final String quotes = "quotes";
    //private static final String 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.toString();
            }
        }
    }

    /**
     * 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{
            String 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
        String 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
        String 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<Quotes> getQuote(int id) {
        ArrayList<Quotes>();
        getReadableDatabase();

        Cursor cursor = db.query(TABLE_Name, new String[] { _Id,
                qotes,author }, _Id + "=?", new String[] { String.valueOf(id) },
                null, null, null, null);

        //String query = "SELECT _Id, qotes, author From "+TABLE_Name;
        //String query = "SELECT * From Quotes";

        //Cursor cursor = db.rawQuery(query, null);

        if (cursor != null)
            cursor.moveToFirst();
        Quotes quotes = new Quotes(Integer.parseInt(cursor.getString(0)),
        cursor.getString(1),cursor.getString(2));
        QuoteList.add(quotes);
        return QuoteList;
    }
    */
}
53
user2438323

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

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
35

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

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

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

Depuis Android 6.0 (API niveau 23), les utilisateurs accordent des autorisations aux applications pendant l'exécution de l'application, et non lors de son installation. Cette approche simplifie le processus d'installation de l'application, car l'utilisateur n'a pas besoin d'accorder d'autorisations lors de l'installation ou de la mise à jour de l'application.

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

Première demande de permissions.

String[] 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, String 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 demande-exécution-autorisations-dans-Android-Marshmallow/

17
AB1209

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

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

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

11
Benoit Duffez

Je pense que c'est parce que votre DB_Path se termine sans "/". Lorsque vous concaténez le chemin avec la base de données, la variable myPath a la chaîne suivante: "/data/data/com.example.quotes/databasesQuotesdb".

Je propose ces modifications:

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

De plus, vous devez ouvrir la base de données dans l'activité Principale et implémenter les méthodes onPause() et onResume() avec respectivement database.close() et database.open(). Voici mon exemple pour l'activité principale (utilisée avec Cordova, conception de sites Web et tout le reste = 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 <content src="index.html" /> 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!!!

5
Shell_Core

DB_PATH pointait vers une base de données différente. Changez-le en classe d'assistance de base de données et mon code fonctionne. 

private static String DB_PATH = "/data/data/com.example.abc";
4
Nidhi Saini

@ nmr vérifie également la propriété et les groupes sur le fichier sqlite lui-même ... J'avais copié ma base de données depuis/sdcard en tant que root, donc je devais modifier les autorisations ..

-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

Utilisez les commandes suivantes pour définir la propriété et le groupe appropriés. Le u0_a80 que j'ai obtenu de ls -al sur d'autres fichiers du répertoire

chown u0_a80 test.sqlite
chgrp u0_a80 test.sqlite
3
GeeElle

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

        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

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

Je ne suis pas sûr que cela cause votre problème. Mais ça a l'air un peu foiré. Tous tes autres trucs me semblent assez classiques.

3
HalR

Mon problème pour ce problème était les autorisations de répertoire incorrectes: 

Bonnes autorisations:

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 autorisations:

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

Comment sont-ils arrivés de cette façon? Je les ai configurés de cette façon, tout en essayant de faire fonctionner adb pull. Clairement je me suis trompé. 

Hé Google, ce serait affreux Nice si une erreur de permission produisait un message d’erreur significatif, ou à défaut si vous n’aviez pas à donner les permissions à Tweak pour utiliser les outils.

2
nmr

J'ai récemment eu cette erreur. Mais c'était encore plus étrange. Je travaillais sur Android N et tout se passait bien, jusqu'à ce que je le teste sur JellyBeans et Lollipop. Dans lequel j'ai continué à avoir la même erreur de base de données.

Android.database.sqlite.SQLiteCantOpenDatabaseException: erreur inconnue (code 14): impossible d'ouvrir la base de données 06-10 23: 07: 03.641: E/SQLiteDatabase (4419):

J'avais les bonnes autorisations dans mon manifeste, y compris:

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

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

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

qui devait être chargé à partir du contexte de cette façon:

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

Maintenant fonctionne correctement sous SDK 17.

1
ChaloTheGreat

Dans des problèmes d'exécution tels que ceux-ci, ouvrez logcat si vous utilisez Android Studio, essayez d'analyser l'arbre de trace, allez au début à partir duquel l'exception a commencé à augmenter, car c'est généralement la source du problème. Maintenant, vérifiez deux choses:

  1. Vérifiez dans l'explorateur de fichiers du périphérique (en bas à droite), il existe une base de données créée par vous . La plupart du temps, vous la trouvez dans DATA -> DATA -> com.example.hpc.demo (votre nom de paquet) -> DATABASE -> demo.db

  2. Vérifiez que vous avez ajouté les éléments requis '/' dans votre classe d'assistance, par exemple comme ci-dessous
    DB_location = "data/data /" + mcontext.getPackageName () + "/ database /";

1
DK SINGH

Effacer les données des applications m'a aidé dans cette tâche. Cela peut vous aider ..

0
akshay bhange

Comme mentionné par @CommonsWare, vous voudrez essayer Android sqlite asset helper . Cela a fait de l’ouverture d’une base de données préexistante un morceau de gâteau.

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

0
craned

vous devez utiliser cette voie pour path:

DB_PATH=  context.getDatabasePath(DB_NAME).getPath();
0
Shahab Rahnama

Le chemin système par défaut de votre base de données d’application pour Android est /Data/data/YOUR_PACKAGE/database/YOUR_DB_NAME

Votre logcat indique clairement Impossible d'ouvrir la base de données '/data/data/com.example.quotes/databasesQuotesdb'

Ce qui signifie qu’il n’ya pas de fichier sur le chemin donné ou Vous avez donné un 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 doit se terminer par "/".

privé statique String DB_PATH = "/data/data/com.example.quotes/databases/";

Votre chemin correct sera maintenant "/ Data/data/com.example.quotes/databases/Quotesdb"

0
Vaibhav Shukla

Ajoutez avant OpenDatabase ces lignes:

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