SQLiteは14のエラーコードを返しました
-
26-10-2019 - |
質問
Assetsフォルダーから既存のデータベースをコピーして、その操作を実行しようとしています。すべてが正常に機能していますが、エミュレータのログファイルで次のエラーを取得しました。
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)
この問題を解決する方法についての提案はありますか?
解決
マニフェストでshareduseridを使用している場合、このエラーが発生することがわかりました。アプリケーションのSharedUserIDを変更してアプリケーションを再インストールすると、SQLiteデータベースに書き込むために必要な所有権がありません。
他のヒント
これは少し遅れているかもしれませんが、これがこの問題を抱えている人に役立つことを願っています(私は決定的な解決策を見つけることができないので)。
私はこの原因の理由を知っていると思います(少なくとも私の場合は)。を見る DDMS->ファイルエクスプローラー, 、あなたはそれを理解するでしょう データベースフォルダー(/data/data //データベース/) 存在しないため、アプリケーションがその存在しないフォルダーにデータベースファイルを作成できない理由です。何らかの方法でデータベースフォルダーを作成できる場合は、この問題を回避できます。
私は怠zyなので、私はただ使用しました /data/data //ファイル/フォルダー エミュレータモードのとき。これを使用してファイルを取得できます。
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統合があります)にログインして表示されました(その後、[および永続的)。何が起こったのかわかりませんが、そのフォルダーを何らかの形で作成することは可能です。この辺りの別の専門家が光を当てるために何か。
今日、この問題は私に3時間かかります。私が試したこと:
- コピーデータベースコードの書き換え。
- エミュレータ /デバイスからアプリを削除します
- ワイプエミュレータ
- Eclipseを掃除します
- ファイル権限の変更
共有ドロップボックスアカウントから別の場所にコードをコピーし、AndroidマニフェストとJavaファイルのコードを別のパッケージ名でリファクタリングすることで問題を解決しました。
アプリケーションは今美しく実行されています。
同じ問題がありました。
それを解決したのは、置き換えられていました
private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
と
String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;
LogCatで同じエラーコードがありました。
sqlite returned: error code = 14, msg = cannot open file at source line
アプリは正常に実行されます(LogCatを見るまで実際に問題に気づきませんでした!)。 LogCatはこのエラーを私に知らせてくれたので、これを解決するのが最善だと思いました。
マニフェストファイルを編集した場合、エラーが削除されたことがわかりました。私のマニフェストの中で、私は間違ったminSDKバージョンを入力していました。マニフェストファイルには、コードの左列に沿って感嘆符インジケーターがあったため、私の間違いを知らせるため、これを発見しました。
徹底的にするために、少なくともそれらを除外できるように、すべてのエラー/感嘆が修正されていることを確認することをお勧めします。
このエラー(および日食の多く)は、膨大な数の要因に応じて発生する可能性があるようです!喜び!
または、私のために働いたもう1つの簡単な解決策は次のとおりです。
- エミュレータの設定オプションで、[アプリケーション]をクリックします
- アプリケーションの管理に移動します
- アプリを見つけて、アンインストールをクリックします
- 次に、Eclipseからアプリをもう一度実行します。
私の理由は異なっていました。データベースを作成したアプリのオンラインバージョンにアクセスしました。 PhoneGapアプリケーションは、別のアプリによって作成されたファイルにアクセスできませんでした。ブラウザキャッシュのクリアは私の問題を解決しました。
エニグマは解決され、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();
}
その後、操作を行います。幸運を!
ドキュメントがわずかに誤解を招くことを認識することで、これを解決することができました。データベースの名前に関連するZipt Assetのファイル名が必要です。たとえば、データベースが呼び出された場合 someData.db
, 、zipファイルはそうでなければなりません someData.zip
.
また、書き込み可能なDBを開いてみると、少し良い診断があるようです。私は次のようにコンストラクターでやったが、それが最終的に私が解決策を把握するのに役立った。
SQLiteDatabase db=getWritableDatabase();
db.close();
すべてのカーソルとDBインスタンスを閉じていることを確認してください。複数の挿入と更新を作成し、カーソルを閉じていないため、カーソルの漏れが発生し、DBを開くことができないため、このエラーが発生しました。