为什么我的exception处理程序没有捕获Android SQLite插入错误?

我是第一次使用SQLite,并且我正在尝试学习它的exception处理,所以我在我的测试应用程序中强制插入错误。 发生exception,我看到它写入了Eclipse LogCat输出窗口。 但是它不会被代码捕获。 我在这里看到了其他关于确保使用正确的exceptiontypes的问题,并认为我已经做对了。 知道我错过了什么吗?

在我的主要活动中的以下语句中, myTable是一个扩展我自己的AbstractDbAdapter的类(它有一个扩展SQLiteOpenHelper的类DatabaseHelper )。

 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) 

myTableAbstractDbAdapter类:

公共类myTable_DbAdapter扩展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 args = new 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”;

     protected DatabaseHelper mDbHelper = null;
     protected SQLiteDatabase mDb = null;

     protected static final String TABLE_CREATE_MYTABLE =
         “创建表myTable(”+
         “id text primary key not null”+
         “,first_seen_ts integer not null”+
         “,last_seen_ts integer not null”+
         “);”;

     protected static final String DATABASE_NAME =“myDB”;
     protected static final int DATABASE_VERSION = 1;

     protected final Context mCtx;

     protected static class DatabaseHelper extends SQLiteOpenHelper {

         DatabaseHelper(Context context){
             super(context,DATABASE_NAME,null,DATABASE_VERSION);
         }

         @覆盖
         public void onCreate(SQLiteDatabase db){
             //注意:SQLite每个表需要一个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 = new DatabaseHelper(mCtx);
         mDb = mDbHelper.getWritableDatabase();
        归还这个;
     }

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

 }

  • 使用OR操作符使用全文search(FTS)和多个标记进行多列search
  • 在SimpleCursorAdapter中使用哪个标志?
  • Android / SQLite:插入 - 更新表列以保留标识符
  • 如何避免SQLiteExceptionlocking错误
  • 从每个类别中至lessselect一个?
  • 如何在Android应用程序中使用现有的数据库
  • Android:扩展用户的联系簿。 性能ContentProvider vs Sqlite vs内存中的List
  • Recyclerview + Content provider + CursorLoader
  • 我在这里find了答案: SQLiteConstraintException未被捕获

    SQLiteDatabase.insert()方法不会引发exception。 D’哦!

    对于像我这样的其他SQLite新手,如果要在插入数据库时​​捕获exception,请使用SQLite.insertOrThrow()方法。 它将引发一个exception,然后您可以捕获并处理它。