android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных

Я читал различные на сайте об этой проблеме, но я не могу понять это. Я использую базу данных предварительной сборки для этого приложения. Я использую jellybean для этого приложения.

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>

Вывод логарифма

согласно logcat, это вызвано 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;
    }
    */
}

person user2438323    schedule 10.06.2013    source источник
comment
Пожалуйста, предоставьте больше информации. В частности, что вы делаете, что вызывает эту ошибку?   -  person Code-Apprentice    schedule 11.06.2013
comment
Я запускаю это на эмуляторе, и он падает. К сожалению приложение остановлено.   -  person user2438323    schedule 11.06.2013
comment
Я не использую SQLiteAssetHelper   -  person user2438323    schedule 11.06.2013
comment
У меня возникает та же проблема при запуске ActivityInstrumentationTestCase2.   -  person Tim Kist    schedule 27.06.2013
comment
Что, если вы создали базу данных в onCreate?   -  person Ethan    schedule 07.08.2013
comment
Также можете ли вы дать некоторую информацию о том, как вы построили базу данных?? И есть ли у вас необходимое разрешение в манифесте для записи в файловую систему.   -  person Varun    schedule 07.08.2013
comment
@ user2438323 : Привет. Как решилась твоя проблема??? Я столкнулся с аналогичной проблемой с аналогичным кодом.   -  person Amit Kumar Kannaujiya    schedule 09.09.2015
comment
Просто примечание: я решаю эту подобную ошибку для уведомления, удаляя и переустанавливая приложение.   -  person Fruit    schedule 20.02.2020


Ответы (21)


Добавьте это разрешение в файл AndroidManifest.xml вашего проекта в тег manifest (который должен быть тегом верхнего уровня).

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
person saeed khalafinejad    schedule 05.11.2013
comment
Оооо!! Совсем забыл об этом!! Большое тебе спасибо - person ; 12.08.2015
comment
Примечание. В Android Marshmallow сначала необходимо реализовать запрос на разрешение, потому что чтение и запись во внешнее хранилище — это опасное разрешение. Дополнительная информация: developer.android.com/training/permissions/requesting.html - person Felix Edelmann; 05.04.2016
comment
Путь: /data/data/com.example.quotes/databases Внутреннее хранилище, зачем нам разрешение external_storage? - person nAkhmedov; 29.10.2018
comment
Почему за него так много голосов? @nAkhmedov прав, нам не нужно разрешение. И Феликс Эдельманн сказал, что нам нужно запросить разрешение, начиная с Android M. В этом сценарии каждое приложение будет запрашивать разрешение на чтение/запись хранилища с первого запуска. - person Oleksandr Albul; 11.03.2021
comment
Вы должны запросить разрешение в первый раз. Кроме того, вышеуказанное разрешение должно быть в файле манифеста. - person saeed khalafinejad; 04.04.2021

Замените код checkDataBase() кодом ниже:

File dbFile = myContext.getDatabasePath(DB_NAME);
return dbFile.exists();
person Andre Rocha    schedule 24.07.2013

Вы можете столкнуться с этой проблемой, если вы используете свое приложение на Android Marshmallow или более поздней версии (уровень API 23 или выше) из-за новой модели разрешений в реальном времени, представленной в этом.

Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения приложениям во время работы приложения, а не при его установке. Такой подход упрощает процесс установки приложения, поскольку пользователю не нужно предоставлять разрешения при установке или обновлении приложения.

Для получения разрешений во время выполнения вам нужно будет запросить пользователя. Вы можете сделать это следующим образом.

Первый запрос разрешений.

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

И тогда вы можете проверить результаты в

@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;
    }
}

Вот хороший источник обучения requesting-runtime-permissions-in-android-marshmallow /

person Arun Badole    schedule 18.01.2016
comment
В какой части кода я должен запрашивать разрешения? - person Marlaurita; 10.12.2016
comment
Согласно developer.android.com/reference/android/, запуск на уровне API 19 это разрешение не требуется для чтения/записи файлов в каталогах вашего приложения. Итак, база данных не создается в конкретной области приложения? - person adarsh; 02.05.2017

Это может быть вызвано плохими разрешениями или SELinux. Убедитесь, что разрешения и владелец/группа установлены правильно. Затем запустите это:

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

restorecon восстанавливает контекст безопасности SELinux по умолчанию для файла

person Benoit Duffez    schedule 16.04.2016
comment
Android 7.0 требовал принудительного флага -F, пока он не заработал. восстановлениекон -F - person user1652110; 13.11.2016

Я думаю, это потому, что ваш DB_Path заканчивается без "/". Когда вы объединяете путь с базой данных, переменная myPath имеет следующую строку: "/data/data/com.example.quotes/databasesQuotesdb".

Предлагаю следующие изменения:

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

И еще, вы должны открыть базу данных в основной активности и реализовать методы onPause() и onResume() с database.close() и database.open() соответственно. Это мой пример для основного действия (используется с Cordova, веб-дизайном и всем прочим = 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();
    }
}

Удачи!!!

person Shell_Core    schedule 11.10.2013

DB_PATH указывал на другую базу данных. Измените его в вспомогательном классе базы данных, и мой код заработает.

private static String DB_PATH = "/data/data/com.example.abc";
person Nidhi Saini    schedule 06.08.2013

Я не думаю, что это ваша проблема, но мне все равно кажется, что это довольно плохо. У вас есть дубликат слоя com.examples.quote в вашем проекте. Раздел «Активность» в вашем AndroidManifest.xml должен выглядеть примерно так:

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

Вы даже можете иметь свои классы в src/com.example.quotes/com.example.quotes, а не только в com.example.quotes.

Я не уверен, что это вызывает вашу проблему. Но выглядит немного запутанным. Все остальные ваши вещи выглядят довольно стандартно для меня.

person HalR    schedule 11.06.2013

@nmr также проверьте права собственности и группы в самом файле sqlite ... Я скопировал свою базу данных из / sdcard от имени пользователя root, поэтому мне пришлось изменить разрешения ...

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

должно быть..

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

Используйте следующие команды для установки правильного владельца и группы. u0_a80 я получил от ls -al в других файлах в каталоге

chown u0_a80 test.sqlite
chgrp u0_a80 test.sqlite
person GeeElle    schedule 05.05.2014

Моим гремлином для этой проблемы были плохие права доступа к каталогу:

Хорошие разрешения:

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

Плохие разрешения:

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

Как они дошли до такого? Я установил их таким образом, пока возился, пытаясь заставить adb pull работать. Ясно, что я сделал это неправильно.

Эй, Google, было бы ужасно хорошо, если бы ошибка разрешения приводила к осмысленному сообщению об ошибке, или если бы вам не приходилось вручную настраивать разрешения для использования инструментов.

person nmr    schedule 11.01.2014

Следует также отметить, что Environment.getExternalStorageDirectory() устарело в API 29, поэтому измените это, если вы используете это для получения пути к базе данных:

https://developer.android.com/reference/android/os/Environment#getExternalStorageDirectory()

Этот метод устарел на уровне API 29.

Чтобы повысить конфиденциальность пользователей, прямой доступ к общим/внешним устройствам хранения не рекомендуется. Когда приложение нацелено на Build.VERSION_CODES.Q, путь, возвращаемый этим методом, больше не доступен приложениям напрямую. Приложения могут продолжать получать доступ к содержимому, хранящемуся в общем или внешнем хранилище, путем перехода на такие альтернативы, как Context#getExternalFilesDir(String), MediaStore или Intent#ACTION_OPEN_DOCUMENT.

person Chin    schedule 16.02.2020

Недавно я столкнулся с этой ошибкой. Но это было еще более странно. Я работал на Android N, и все шло гладко, пока я не протестировал его на JellyBeans и Lollipop. В котором я продолжал получать ту же ошибку БД.

android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных 06-10 23:07:03.641: E/SQLiteDatabase (4419):

У меня были правильные разрешения в моем манифесте, в том числе:

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

Проблема заключалась в этой строке в моем DataBaseHelper.java:

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

который нужно было загрузить из контекста следующим образом:

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

Теперь работает правильно с SDK 17.

person ChaloTheGreat    schedule 12.01.2018
comment
Я бы хотел, чтобы я прошел этот пост раньше, это сэкономило бы мне 2 дня. - person Mohammedsalim Shivani; 28.02.2019
comment
Замена getContext().getApplicationInfo().dataDir+"/databases/"; на new File(getContext().getApplicationInfo().dataDir, "databases").getAbsolutePath(); позволит добавить необходимый разделитель пути. - person david; 22.09.2019

В таких проблемах во время выполнения сначала откройте logcat, если вы используете студию Android, попробуйте проанализировать дерево трассировки, перейдите к началу, с которого началось возникновение исключения, поскольку обычно это является источником проблемы. Теперь проверьте две вещи:

  1. Проверьте в проводнике файлов устройства (справа внизу), существует ли база данных, созданная вами. в основном вы найдете его в DATA -> DATA -> com.example.hpc.demo (имя вашего пакета) -> DATABASE -> demo.db

  2. Убедитесь, что в вашем вспомогательном классе вы добавили обязательные '/', например, как показано ниже
    DB_location = "data/data/" + mcontext.getPackageName() + "/database/";

person DK SINGH    schedule 16.09.2018

Добавьте перед OpenDatabase следующие строки:

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

Как упоминалось в @CommonsWare, вы можете попробовать помощник по активам sqlite для Android. Это сделало открытие уже существующей БД для меня куском пирога.

Я буквально заработал примерно через полчаса после того, как потратил 3 часа, пытаясь сделать все это вручную. Забавно, я думал, что делаю то же самое, что и библиотека, но чего-то не хватало!

person craned    schedule 06.01.2016

Мне в этом помогла очистка данных приложения. Вам может помочь..

person akshay bhange    schedule 17.02.2016

Системный путь Android по умолчанию к базе данных вашего приложения: /data/data/YOUR_PACKAGE/databases/YOUR_DB_NAME

Ваш логарифм ясно говорит, что не удалось открыть базу данных '/data/data/com.example.quotes/databasesQuotesdb'

Это означает, что по указанному пути нет файла или вы указали неправильный путь для файла данных. Как я вижу, после папки с базами данных должно быть «/».

Ваша переменная DB_PATH должна заканчиваться на «/».

частная статическая строка DB_PATH = "/data/data/com.example.quotes/databases/";

Ваш правильный путь теперь будет "/data/data/com.example.quotes/databases/Quotesdb"

person Vaibhav Shukla    schedule 05.09.2018

вы должны использовать этот путь для пути:

DB_PATH=  context.getDatabasePath(DB_NAME).getPath();
person Shahab Rahnama    schedule 13.12.2018

android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14): не удалось открыть базу данных

Если вы получаете это после замены файлов базы данных с помощью Проводника устройств, иногда это происходит из-за разрешений и контекстов безопасности SELinux. Проводник устройства (начиная с AS3.6.3) загрузит их с правами root/rwxrwxrwx, установленными для всех (777). Поищите в папках вашего приложения идентификатор пользователя, используемый для вашего приложения. Выполните следующие команды в терминале:

   adb devices
   emulator-5554
   adb root
   adb -s emulator-5554 shell
   cd /data/data/com.yourorg.yourapp
   ls -l

Вы получите список вроде:

drwxrwx--x 2 u0_a85 u0_a85 4096 2020-04-23 16:09 cache
drwxrwx--x 2 u0_a85 u0_a85 4096 2020-04-23 16:09 code_cache
drwxrwx--x 2 u0_a85 u0_a85 4096 2020-04-23 16:09 databases
drwxrwx--x 2 u0_a85 u0_a85 4096 2020-04-23 16:09 shared_prefs

u0_a85 (или что-то еще) будет владельцем приложения и идентификатором группы. Удалите свои базы данных на устройстве, замените файлы базы данных с помощью Проводника устройства и в терминале выполните следующее (учитывая идентификатор владельца):

cd databases
chown u0_a85 *.db; chgrp u0_a85 *.db; chmod 600 *.db; restorecon *.db

Это изменяет файлы базы данных на их соответствующие идентификаторы владельца/группы, разрешения RW и сбрасывает контексты безопасности SELinux для этих файлов. Хотя у меня была успешная замена файлов базы данных, НЕ требующая этого, эта проблема, кажется, возникает достаточно случайно, чтобы это работало.

person SHartley    schedule 23.04.2020

У меня была эта проблема как у пользователя, а не у разработчика. и причина в моем случае была другой.

https://del.dog/ufinunacul.txt
Оказалось, что в папку data добавлялся битый link , указывающий на второй раздел моей карты памяти, где я храню app data , при удалении broken link все было нормально

person user1874594    schedule 22.03.2021

Это вызвано тем, что у вас нет разрешения на запись во внешнее хранилище во время инициализации объекта базы данных SQLite. то есть

db2=SQLiteDatabase.openOrCreateDatabase(DBPATH, null);

Это может быть связано с тем, что вы запрашиваете разрешение, но вы еще не предоставили разрешение, но экземпляр базы данных инициализирован. Имейте в виду, что для создания файла базы данных необходимы разрешения на внешнее хранилище. Выполняйте все операции записи только после разрешения. Вы можете сделать это в onRequestPermissionsResult.

person Amit Bhatiwal    schedule 25.03.2021

Убедитесь, что вы не пытаетесь повторно открывать и закрывать базу данных из основного или фонового потока.

Создайте в своем приложении одноэлементный класс и попробуйте создавать и открывать данные только из этого класса.

Это гарантирует вам, что вызов открытия базы данных будет сделан только тогда, когда она не существует.

Во всем приложении используйте один и тот же подход для получения объекта sqLiteDatabase, когда это необходимо.

Я использовал приведенный ниже код, и моя проблема решена через 1,5 дня.

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

В вашем классе Activity метод 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;        
    }      
}    
person Vikash Kumar Tiwari    schedule 30.09.2016