私は初めて 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;
}
}
}