web-dev-qa-db-ja.com

android.database.sqlite.SQLiteCantOpenDatabaseException:不明なエラー(コード14):データベースを開けませんでした

私はこの問題についてさまざまなサイトを読みましたが、これを理解することはできません。このアプリには事前構築データベースを使用しています。このアプリにはジェリービーンを使用しています。

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

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;
    }
    */
}
59
user2438323

この許可をプロジェクトのAndroidManifest.xmlファイルのmanifestタグ(最上位タグである必要があります)に追加します。

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

CheckDataBase()コードを次のコードに置き換えます。

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

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 /

17
AB1209

これは、不正なアクセス許可またはSELinuxが原因である可能性があります。許可と所有者/グループが正しく設定されていることを確認してください。次に、これを実行します:

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

restorecon ファイルのデフォルトSELinuxセキュリティコンテキストを復元します

11
Benoit Duffez

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、Webデザイン、およびすべてのもの= 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();
    }
}

幸運を!!!

5
Shell_Core

DB_PATHが別のデータベースを指していました。データベースヘルパークラスで変更し、コードを機能させます。

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

@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
3
GeeElle

これはあなたの問題ではないと思いますが、それでも私にはかなり悪いように見えます。プロジェクトにcom.examples.quoteのレイヤーが重複しています。 AndroidManifest.xmlのActivityセクションは次のようになります。

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

クラスをcom.example.quotesだけでなくsrc/com.example.quotes/com.example.quotesの下に置くこともできます。

これが問題の原因かどうかはわかりません。しかし、それは少しめちゃくちゃに見えます。あなたの他のすべてのものは私にはかなり標準に見えます。

3
HalR

この問題に対する私のグレムリンは、ディレクトリのアクセス許可が不適切でした。

良い許可:

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、許可エラーが意味のあるエラーメッセージを生成した場合、またはツールを使用するためにTweak許可を渡す必要がなかった場合は失敗しました。

2
nmr

私は最近このエラーを思いつきました。しかし、それはさらに奇妙でした。 JellyBeansとLollipopでテストするまで、Android Nに取り組んでいて、すべてが順調に順調に進んでいました。私は同じDBエラーを取得し続けました。

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から正常に動作するようになりました。

1
ChaloTheGreat

Android studioを使用している場合、これらのような実行時の問題では、まずlogcatを開き、トレースツリーを分析して、例外が発生し始めたところから始めます。次の2つのことを確認します。

  1. デバイスファイルエクスプローラー(右下)で、作成したデータベースが存在することを確認します。ほとんどの場合、DATA-> DATA-> com.example.hpc.demo(ご使用のパッケージ名)-> DATABASE-> demo.dbにあります。

  2. ヘルパークラスに必要な '/'が以下のように追加されていることを確認してください
    DB_location = "data/data /" + mcontext.getPackageName()+ "/ database /";

1
DK SINGH

アプリケーションデータをクリアすると、この点で役立ちました。役に立つかもしれません。

0
akshay bhange

@CommonsWareで述べたように、 Android sqlite asset helper を試してください。既存のデータベースを開くことは私にとって簡単なことでした。

文字通り、3時間かけてすべて手動で実行しようとした後、約30分で動作しました。おもしろいことに、私は図書館が私のためにしたのと同じことをしていると思っていましたが、何かが欠けていました!

0
craned

パスには次の方法を使用する必要があります。

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

アプリケーションデータベースのAndroidのデフォルトのシステムパスは/ data/data/YOUR_PACKAGE/databases/YOUR_DB_NAMEです

あなたのlogcatは、データベース「/data/data/com.example.quotes/databasesQuotesdb」を開けませんでした

つまり、指定されたパスにファイルが存在しないか、またはデータファイルのパスが間違っていますです。私が見ることができるように、データベースフォルダの後に「/」があるはずです。

DB_PATH変数は「/」で終わる必要があります。

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

正しいパスは「/data/data/com.example.quotes/databases/Quotesdb」になります

0
Vaibhav Shukla

OpenDatabaseの前に次の行を追加します。

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