1

インポート/エクスポートデータを実装しようとしているため、インポートされたファイルがエラーを管理するためのsqliteデータベースでない場合に何が起こるかをテストしたいと思います。

logcatには次のものがあります。

03-22 15:02:39.957: E/SQLiteLog(20407): (26) file is encrypted or is not a database
03-22 15:02:39.978: E/DefaultDatabaseErrorHandler(20407): Corruption reported by sqlite on database: /data/data/com.crbin1.ltd/databases/dbltd
03-22 15:02:40.017: E/DefaultDatabaseErrorHandler(20407): deleting the database file: /data/data/com.crbin1.ltd/databases/dbltd

アプリケーションは、ユーザーにエラーなしで新しい空のデータベースを作成するだけです。

dbインポート後、次のコードを呼び出します(DatabaseLTDは私のSQliteOpenHelperクラスです)

private void checkImportedDb() {
    try {
        DatabaseLTD dbltd = new DatabaseLTD(mCtx);
        SQLiteDatabase db = dbltd.getReadableDatabase();
    } catch (SQLiteException e) {
        e.printStackTrace();
    }
}

しかし、「ファイルが暗号化されているか、データベースではありません」というエラーを傍受することはできません。エラーをキャッチして管理するにはどうすればよいですか?

4

1 に答える 1

2

SQLiteOpenHelperコンストラクター:

public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)

エラーハンドラ引数「DatabaseErrorHandler」が必要です。

sqliteがデータベースの破損を報告するときに使用するか、デフォルトのエラーハンドラーを使用する場合はnullを使用します。

それはあなたが探しているものかもしれません。

編集:crbin1が正しく指摘しているように、コンストラクターはAPI>=11のみです。

API <11の場合、私の(テストされていない)提案は、データベースを開いてテーブルのリストを取得することです。

データベース内のすべてのテーブルのリストを取得します

ロードする予定のデータベースに少なくとも1つがバインドされている場合は、番号を確認するか、さらに良いことに、特定のテーブルがすでに存在することを確認できます。

空のDBもチェックできるようにしたい場合は、最後の努力として、SQLiteDatabaseメソッドを試してみてください。

public static SQLiteDatabase openDatabase (String path, SQLiteDatabase.CursorFactory factory, int flags) 

私はチェックしませんでしたが、「flag」パラメータに関する情報、特に次の行が一貫していないため、このメソッドのドキュメントが正しくないことを強く疑っています。

フラグOPEN_READWRITEOPEN_READONLYCREATE_IF_NECESSARYおよび/またはNO_LOCALIZED_COLLATORSに従ってデータベースを開きます。

「intflags」パラメーターの存在と衝突します。

データベースアクセスモードを制御するためのフラグ

私は怠け者だと知っているので、これを自分で確認する必要がありますが、その場合は、openDatabaseを使用して、OPEN_READONLYを使用し、CREATE_IF_NECESSARYを使用せずにデータベースを事前検証し、例外(存在する場合)をキャッチしてから、 「標準の」SQLiteOpenHelperアプローチを続行します。

于 2013-03-22T15:23:40.733 に答える