4
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はスタックトレースでいっぱいです。コメント付きの行の兆候はありません(上記を参照)。

どのように処理できますか。注意:私のプログラム全体で挿入条件(上記)は1つだけです。テストOK、次に進みます。

また、データベースが作成されているか、すでに存在しているかどうかを処理して、存在する場合はDownloadTaskを実行しないようにする方法も教えてください。

4

2 に答える 2

11

たぶん、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;
    }
于 2012-10-04T10:39:41.063 に答える
3

android.database.sqlite.SQLiteConstraintExceptionの代わりに使用する必要がありますandroid.database.sqlite.SQLiteException

これが機能しない場合は、例外をキャッチしExceptionて、catchブロックが呼び出されているかどうかを確認してください。

于 2012-08-02T11:24:24.240 に答える