19

私は初めて SQLite を使用しており、その例外処理を学習しようとしているため、テスト アプリで挿入エラーを強制しています。例外が発生し、Eclipse LogCat 出力ウィンドウに書き込まれます。ただし、コードに引っかかることはありません。正しい例外タイプを確実に使用することについて、ここで他の質問を見てきましたが、それは正しいと思います。私が見逃しているものはありますか?

私の主な活動にある次のステートメントでは、myTable私自身を拡張するクラスです( を拡張AbstractDbAdapterするクラスがあります)。DatabaseHelperSQLiteOpenHelper

try {
    myTable.create("dupkey");
}
catch (android.database.sqlite.SQLiteConstraintException e) {
    Log.e(TAG, "SQLiteConstraintException:" + e.getMessage());
}
catch (android.database.sqlite.SQLiteException e) {
    Log.e(TAG, "SQLiteException:" + e.getMessage());
} 
catch (Exception e) {
    Log.e(TAG, "Exception:" + e.getMessage());
}

スタック トレースの例:

Error inserting id="dupkey" last_seen_ts=1360624732 first_seen_ts=1360624732 android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
  at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
  at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1582)
  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
  at com.myCompany.testApp.myTable_DbAdapter.create(myTable_DbAdapter.java:51)

myTableクラスAbstractDbAdapter:

public class myTable_DbAdapter extends AbstractDbAdapter {

    private static final String DATABASE_TABLE = "myTable";

    // 列名 -- ContentValues() のキー
    public static final String KEY_ID = "id";
    public static final String KEY_FIRST_SEEN = "first_seen_ts";
    public static final String KEY_LAST_SEEN = "last_seen_ts";

    public myTable_DbAdapter(Context ctx) {
        スーパー (ctx);
    }

    public long create(String id) {
        long firstSeen = System.currentTimeMillis() / 1000; // SQLite のタイムスタンプは秒単位です

        ContentValues 引数 = 新しい ContentValues();
        args.put(KEY_ID, id);
        args.put(KEY_FIRST_SEEN, firstSeen);
        args.put(KEY_LAST_SEEN, firstSeen); // 新しいエントリのデフォルトは firstSeen です

        return mDb.insert(DATABASE_TABLE, null, args);
    }
}

パブリック抽象クラス AbstractDbAdapter {

    protected static final String TAG = "AbstractDbAdapter";

    保護された DatabaseHelper mDbHelper = null;
    保護された SQLiteDatabase mDb = null;

    protected static final 文字列 TABLE_CREATE_MYTABLE =
        "テーブル myTable を作成します (" +
        " ID テキストの主キーが null ではありません" +
        ", first_seen_ts null でない整数" +
        ", last_seen_ts null でない整数" +
        ");";

    protected static final String DATABASE_NAME = "myDB";
    protected static final int DATABASE_VERSION = 1;

    保護された最終コンテキスト mCtx;

    protected static class DatabaseHelper は SQLiteOpenHelper を拡張します {

        DatabaseHelper(コンテキスト コンテキスト) {
            スーパー (コンテキスト、DATABASE_NAME、null、DATABASE_VERSION);
        }

        @オーバーライド
        public void onCreate(SQLiteDatabase db) {
            // 注: SQLite ではテーブルごとに 1 つの execSQL が必要です
            db.execSQL(TABLE_CREATE_MYTABLE);
        }

        @オーバーライド
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "データベースをバージョン " + oldVersion + " から " + newVersion + " にアップグレードすると、既存のデータが破壊されます。");
            db.execSQL("DROP TABLE IF EXISTS myTable");
            onCreate(デシベル);
        }
    }

    public AbstractDbAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    public AbstractDbAdapter open() は SQLException をスローします {
        mDbHelper = 新しい DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();
        これを返します。
    }

    public void close() {
        もし (mDb != null) {
            mDb.close();
            mDb = null;
        }
        if (mDbHelper != null) {
            mDbHelper.close();
            mDbHelper = null;
        }
    }

}
4

2 に答える 2

31

ここで答えを見つけました: SQLiteConstraintException not catch

SQLiteDatabase.insert() メソッドは例外をスローしません。ああ!

私のような他の SQLite 初心者の場合、データベースへの挿入時に例外をキャッチする場合は、SQLite.insertOrThrow() メソッドを使用します。キャッチして処理できる例外がスローされます。

于 2013-02-12T01:12:20.110 に答える