私は初めて SQLite を使用しており、その例外処理を学習しようとしているため、テスト アプリで挿入エラーを強制しています。例外が発生し、Eclipse LogCat 出力ウィンドウに書き込まれます。ただし、コードに引っかかることはありません。正しい例外タイプを確実に使用することについて、ここで他の質問を見てきましたが、それは正しいと思います。私が見逃しているものはありますか?
私の主な活動にある次のステートメントでは、myTable
私自身を拡張するクラスです( を拡張AbstractDbAdapter
するクラスがあります)。DatabaseHelper
SQLiteOpenHelper
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; } } }