web-dev-qa-db-ja.com

SQLiteはエラーコード14を返しました

アセットフォルダーから既存のデータベースをコピーして、それに対していくつかの操作を実行しようとしています。すべてが正常に機能していますが、エミュレータのログファイルに次のエラーが表示されます。

sqlite returned: error code = 14, msg = cannot open file at source line 25467

09-06 11:23:41.844: INFO/Database(22560): sqlite returned: error code = 14, msg = cannot open file at source line 25467
09-06 11:23:41.885: ERROR/Database(22560): sqlite3_open_v2("/data/data/com.dhani.Lazy/databases/LazyDB.sqlite", &handle, 1, NULL) failed
09-06 11:23:41.885: WARN/System.err(22560): Android.database.sqlite.SQLiteException: unable to open database file
09-06 11:23:41.894: WARN/System.err(22560):     at Android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
09-06 11:23:41.904: WARN/System.err(22560):     at Android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.Java:1849)
09-06 11:23:41.914: WARN/System.err(22560):     at Android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.Java:820)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.checkDataBase(DataBaseHelper.Java:72)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.createDataBase(DataBaseHelper.Java:47)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.Login(DataBaseHelper.Java:166)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Views.LoginView$1.onClick(LoginView.Java:63)
09-06 11:23:41.934: WARN/System.err(22560):     at Android.view.View.performClick(View.Java:2485)
09-06 11:23:41.934: WARN/System.err(22560):     at Android.view.View$PerformClick.run(View.Java:9080)
09-06 11:23:41.944: WARN/System.err(22560):     at Android.os.Handler.handleCallback(Handler.Java:587)
09-06 11:23:41.944: WARN/System.err(22560):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
09-06 11:23:41.944: WARN/System.err(22560):     at Android.os.Looper.loop(Looper.Java:123)
09-06 11:23:41.944: WARN/System.err(22560):     at Android.app.ActivityThread.main(ActivityThread.Java:3683)
09-06 11:23:41.964: WARN/System.err(22560):     at Java.lang.reflect.Method.invokeNative(Native Method)
09-06 11:23:41.964: WARN/System.err(22560):     at Java.lang.reflect.Method.invoke(Method.Java:507)
09-06 11:23:41.964: WARN/System.err(22560):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
09-06 11:23:41.964: WARN/System.err(22560):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
09-06 11:23:41.964: WARN/System.err(22560):     at dalvik.system.NativeStart.main(Native Method)

この問題を解決する方法に関する提案はありますか?

16
Kishore

マニフェストでsharedUserIdを使用している場合に、このエラーが発生することを確認しました。アプリケーションのsharedUserIdを変更して再インストールした場合、そのアプリケーションにはSQLiteデータベースに書き込むために必要な所有権がありません。

6
Nic Strong

これは少し遅れる可能性がありますが、この問題が発生する人にとって役立つことを願っています(決定的な解決策を見つけることができないため)。

私はこの原因の理由を知っています(少なくとも私の場合)。 DDMS-> File Explorerを見ると、Database Folder(/ data/data // databases /)が存在しないため、アプリケーションは存在しないフォルダーにデータベースファイルを作成できません。何らかの方法でデータベースフォルダを作成できる場合は、この問題を回避できます。

私は怠惰なので、エミュレーターで/ data/data // files/folderを使用しましたモード。これを使用してファイルdirを取得できます。

context.getFilesDir().getPath()

これは私にとってエミュレータで美しく機能しました。

これが誰かを助けることを願っています。

いくつかのコードを見たい場合:

String dbFilename = "example.db";
try
{       
    File databaseFile = getDatabasePath(dbFilename);        
        SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
} catch (Exception e)
{
    String databasePath =  getFilesDir().getPath() +  "/" + dbFilename;
    File databaseFile = new File(databasePath); 
    _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
}

編集:私はFacebookにログインしてみました(私のアプリにはFB統合が含まれています)。その後、/ databasesフォルダーが表示されました(そして永続化されました)。何が起こったのかわかりませんが、どういうわけかそのフォルダを作成することは可能です。このあたりの別の専門家が光を当てる何か。

8
El Jae

今日、この問題は3時間かかりました。私が試したこと:

  • コピーデータベースコードを書き換えます。
  • エミュレーター/デバイスからアプリを削除する
  • ワイピングエミュレータ
  • Eclipseのクリーニング
  • ファイルのアクセス許可を変更する

共有Dropboxアカウントから別の場所にコードをコピーし、Android ManifestおよびJavaファイルに別のパッケージ名を付けて)コードをリファクタリングすることで問題を解決しました。

これでアプリケーションは美しく実行されます。

6
artens

同じ問題がありました。

それを解決したのは

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;
6
SteBra

私はlogcatで同じエラーコードを持っていました:

sqlite returned: error code = 14, msg = cannot open file at source line

アプリは正常に動作します(logcatを見るまで、実際には問題に気づきませんでした!)。 Logcatからこのエラーが通知されたので、今すぐこの問題を解決するのが最善だと思いました。

マニフェストファイルを編集すると、エラーが解消されることがわかりました。マニフェスト内で、間違ったmin sdkバージョンを入力しました。これを発見したのは、マニフェストファイル内に、コードの左側の列に感嘆符があり、自分の間違いを通知していたためです。

完全にするには、すべてのエラー/感嘆符が修正されていることを確認して、少なくともそれらを除外できるようにすることをお勧めします。

このエラー(およびEclipseではさらに多くのエラー)は、非常に多くの要因に応じて発生する可能性があります。ああ、喜び!

3
Odhran

または、私にとってうまくいった別の簡単な解決策は次のとおりです:

  1. エミュレータの設定オプションで、[アプリケーション]をクリックします
  2. アプリケーションの管理に移動します
  3. アプリを見つけて、[アンインストール]をクリックします
  4. 次に、Eclipseからアプリを再度実行します。
3
Prativa

すべてのカーソルとdbインスタンスを閉じていることを確認してください。複数の挿入と更新を行い、カーソルを閉じずにカーソルリークを引き起こし、dbを開くことができないため、このエラーが発生しました。

2
live-love

ドキュメントが少し誤解を招くものであることを理解することで、私はこれをなんとか解決しました。データベースの名前に関連する圧縮されたアセットのファイル名が必要です。たとえば、データベースがsomeData.db、ZipファイルはsomeData.Zip

また、書き込み可能なデータベースを開こうとすると、診断が少し良くなるようです。私は次のようにコンストラクターで行いました。これが最終的に解決策を理解するのに役立ちました。

SQLiteDatabase db=getWritableDatabase();
db.close();
2
PearsonArtPhoto

エニグマは解決され、DBなしでエミュレーターでテストされ、それらに間違ったマークを付けるため、最初にDBを作成する必要があります

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    //Destination folder (where we created the DB empty)
    String outFileName = DB_PATH + DB_NAME;

    //We opened it BBDD Vacia as OutputStream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //Transfers Bytes between input and output Stream
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the open files
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

その後、操作を行います。幸運を!

2
rodologic

私の理由は異なりました。私はデータベースを作成したアプリのオンラインバージョンにアクセスしました。その後、PhoneGapアプリケーションは、別のアプリによって作成されたファイルにアクセスできませんでした。ブラウザのキャッシュをクリアすると問題が解決しました。

2
Jan Zahradník

一部のデバイスでは、データベースディレクトリが自動的に作成されません。不足しているdatabasesディレクトリを検出して作成するだけです。

File databaseFile = getDatabasePath("my.db");

// Create directory when needed
File databaseDir = databaseFile.getParentFile();
if(!databaseDir.exists()) {
    databaseDir.mkdirs();
}

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile);
0
gingo