17

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

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)

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

4

11 に答える 11

9

これは少し遅れているかもしれませんが、これがこの問題を抱えている人の助けになることを願っています (決定的な解決策が見つからないため)。

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

私は怠け者なので、エミュレータ モードのときは/data/data//files/ フォルダを使用しました。これを使用してファイルディレクトリを取得できます:

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フォルダーが表示されました(そして持続しました)。何が起こったのかわかりませんが、どうにかしてそのフォルダーを作成することは可能です。このあたりの別の専門家が明らかにする何か。

于 2013-08-29T12:38:24.707 に答える
6

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

于 2011-09-06T09:36:24.233 に答える
6

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

  • コピー データベース コードの書き換え。
  • エミュレーター/デバイスからのアプリの削除
  • エミュレーターのワイプ
  • 日食のクリーニング
  • ファイルのパーミッションの変更

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

アプリケーションは現在、美しく動作します。

于 2012-12-27T16:12:38.133 に答える
6

私も同じ問題を抱えていました。

それを解決したのは、交換でした

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

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;
于 2013-11-28T13:16:31.950 に答える
3

または、私のために働いた別の簡単な解決策は次のとおりです。

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

logcat で同じエラー コードが表示されました。

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

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

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

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

膨大な数の要因に応じて、このエラー (および Eclipse ではさらに多くのエラー) が発生する可能性があるようです! ああ、喜び!

于 2012-01-28T12:18:10.307 に答える
2

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

于 2013-02-02T18:27:17.700 に答える
2

謎は解決され、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();
}

その後、操作を行ってください。幸運を!

于 2013-07-10T05:41:54.783 に答える