【问题标题】:Android SQLite Contraint Conflict. Try/Catch couldn't catchAndroid SQLite 约束冲突。 Try/Catch 无法捕捉
【发布时间】:2012-08-02 11:20:04
【问题描述】:
08-02 16:26:24.750: E/Database(28841): Error inserting data
08-02 16:26:24.750: E/Database(28841): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
08-02 16:26:24.750: E/Database(28841):  at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
08-02 16:26:24.750: E/Database(28841):  at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
08-02 16:26:24.750: E/Database(28841):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1584)
08-02 16:26:24.750: E/Database(28841):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1428)
08-02 16:26:24.750: E/Database(28841):  at com.app.android.DataOperations.insertItems(DataOperations.java:69)
08-02 16:26:24.750: E/Database(28841):  at com.app.android.DownloadTask.createDatabase(DownloadTask.java:173)
08-02 16:26:24.750: E/Database(28841):  at com.app.android.DownloadTask.doInBackground(DownloadTask.java:59)
08-02 16:26:24.750: E/Database(28841):  at com.app.android.DownloadTask.doInBackground(DownloadTask.java:1)
08-02 16:26:24.750: E/Database(28841):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-02 16:26:24.750: E/Database(28841):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-02 16:26:24.750: E/Database(28841):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-02 16:26:24.750: E/Database(28841):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-02 16:26:24.750: E/Database(28841):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-02 16:26:24.750: E/Database(28841):  at java.lang.Thread.run(Thread.java:1019)

以上是我的 LogCat 报告。我想做的是插入数据。查看logcat后,我发现这是违反约束的。我试着把我的代码写成:

public void insert(...){
            long insertID = 0;
            try{
                Log.i("DataOperation", String.valueOf(insertID));
                insertID = sqllitedb.insert(DBase.TABLE_NAME, null, contentValues);
            }catch(android.database.sqlite.SQLiteException ex){
                Log.i("dataops_", "Error Constraint"); //Print
            }

}

什么都没有发生.. 我的 logcat 充满了堆栈跟踪。没有注释行的符号(见上文)。

如何处理。 注:我的整个程序中只有一个插入语句(如上)。测试OK,我继续。

还告诉我如何处理我的数据库是否已创建/已经存在,这样如果存在我就不会运行我的 DownloadTask。

【问题讨论】:

    标签: android sqlite try-catch constraints


    【解决方案1】:

    也许insert(..) 方法本身会捕获异常。

    改用insertOrThrow(..) 方法。

        try {
            SQLiteDatabase db = SQLiteHelper.getDatabase();
            db.insertOrThrow(Table, nullColumnHack, values);
        } catch (SQLiteConstraintException e) {
            Log.d(TAG, "failure to insert word,", e);
            return false;
        }
    

    【讨论】:

      【解决方案2】:

      您需要使用android.database.sqlite.SQLiteConstraintException 而不是android.database.sqlite.SQLiteException

      如果这不起作用,请尝试使用 Exception 捕获任何异常,以查看是否正在调用 catch 块。

      【讨论】:

      • SQLiteConstraintException 是 SQLiteException 的子类,因此 OP 不需要更改它。
      • 我考虑过,这就是为什么我让他尝试Exception
      • 是的,我尝试了两种方式。最初我使用的是 android.database.sqlite.SQLiteConstraintException,接下来我使用了 Exception,现在使用的是 SQLiteException。
      • 尝试调试和单步调试你的代码,这样你也许能更好地发现问题所在......
      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多