2

私はAndroidでSQLiteを使用していますが、このエラーが発生します

02-11 18:05:37.224: E/SQLiteDatabase(26583): android.database.sqlite.SQLiteConstraintException: columns name, foreign_word are not unique (code 19)

ただし、これはonUpgrade()が呼び出された直後に呼び出されるため、データベース自体には何も存在しないはずです。これは使用されるSQLステートメントです:

private static final String CREATE_DB_TB_2 = "CREATE TABLE "
        + TABLE_VOCAB_WORDS + "(" + COLUMN_NAME + " TEXT NOT NULL,"
        + COLUMN_WORD_FOREIGN + " TEXT NOT NULL," + COLUMN_WORD_ENGLISH
        + " TEXT NOT NULL," + COLUMN_CORRECT
        + " BYTE NOT NULL, PRIMARY KEY (" + COLUMN_NAME + ","
        + COLUMN_WORD_FOREIGN + "))";

テーブルを削除してもデータベースには何もないのに、何かを追加するとエラーが発生するのはなぜですか?さらに、context.deleteDatabase(NAME);を呼び出しています。アプリを実行するたびに。テーブルが空なので、物事は一意でなければなりません!

前もって感謝します

フルLogCat:

02-11 18:38:02.811: E/SQLiteDatabase(28631): Error inserting correct=0 english_meaning= tener prisa foreign_word=to be in a hurry  name=AQA GCSE Spanish Higher
02-11 18:38:02.811: E/SQLiteDatabase(28631): android.database.sqlite.SQLiteConstraintException: columns name, foreign_word are not unique (code 19)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:775)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1525)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1395)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at com.sharma.gcsevocabtester.DatabaseManipulator.addWord(DatabaseManipulator.java:168)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at com.sharma.gcsevocabtester.DatabaseManipulator$ImportVocabList.onPostExecute(DatabaseManipulator.java:420)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at com.sharma.gcsevocabtester.DatabaseManipulator$ImportVocabList.onPostExecute(DatabaseManipulator.java:1)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.os.AsyncTask.finish(AsyncTask.java:631)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.os.Handler.dispatchMessage(Handler.java:99)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.os.Looper.loop(Looper.java:155)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at android.app.ActivityThread.main(ActivityThread.java:5454)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at java.lang.reflect.Method.invokeNative(Native Method)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at java.lang.reflect.Method.invoke(Method.java:511)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
02-11 18:38:02.811: E/SQLiteDatabase(28631):    at dalvik.system.NativeStart.main(Native Method)

さらに、これが違いを生むかどうかはわかりませんが、この文字列を使用して作成された別のテーブルもあります。

private static final String CREATE_DB_TB_1 = "CREATE TABLE "
        + TABLE_VOCAB_INFO + "(" + COLUMN_NAME
        + " TEXT NOT NULL PRIMARY KEY," + COLUMN_URL + " TEXT NOT NULL,"
        + COLUMN_DOWNLOADED + " TEXT NOT NULL)";

ImportVocabListは非同期タスクです。これはonPostExecuteです:

**
     * Method called after execution has happen, passing in the result
     * 
     * @Override
     */
    protected void onPostExecute(ArrayList<Word> result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
        boolean b = false;
        open();
        for (Word w : result) {

            addWord(w, vlName);
        }
        if (getAllVocabListsWhere(DatabaseManipulator.COLUMN_DOWNLOADED,
                "false").size() == 0) {
            b = true;
        }
        close();
        if (b) {
            context.finish();
        }
    }

addWordメソッドは次のとおりです。

          public boolean addWord(Word w, String name) {
    try {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_NAME, name);
        cv.put(COLUMN_WORD_FOREIGN, w.getWordForeign());
        cv.put(COLUMN_WORD_ENGLISH, w.getWordEnglish());
        cv.put(COLUMN_CORRECT, w.getCorrect());
        database.insert(TABLE_VOCAB_WORDS, null, cv);
        return true;
    } catch (SQLiteException e) {
        System.out.println("SQL ERROR");
        return false;
    }
}

問題は修正されました-重複したエントリがありましたが、無視されました。ありがとう

4

3 に答える 3

3

AsyncTaskのonPostExecute()メソッドを見ると、に少なくとも1つの重複する値のセットがあると確信していますresult。これらの重複をソースから削除するだけです。

または、重複するエントリのある行を無視して「conflict-clause」を介して続行するようにテーブルに指示することもできます。

private static final String CREATE_DB_TB_2 = "CREATE TABLE "
        + TABLE_VOCAB_WORDS + "(" + COLUMN_NAME + " TEXT NOT NULL,"
        + COLUMN_WORD_FOREIGN + " TEXT NOT NULL," + COLUMN_WORD_ENGLISH
        + " TEXT NOT NULL," + COLUMN_CORRECT
        + " BYTE NOT NULL, PRIMARY KEY (" + COLUMN_NAME + ","
        + COLUMN_WORD_FOREIGN + ") ON CONFLICT IGNORE)";
于 2013-02-11T19:12:50.147 に答える
0

nameforeign_wordこの表で主(一意!)キーを作成します。重複したキー付き行を挿入しようとしている必要があります。2つのフィールドの組み合わせは一意である必要があります。

于 2013-02-11T18:22:41.357 に答える
0

使用する

db.insertOrThrow(TABLE_VOCAB_WORDS, null, cv);

それは私が無視する理由で私のために働いた。

于 2014-07-04T09:35:07.810 に答える