Android SQLite Columns …不是唯一的

我在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) 

此外,我不确定这是否有所作为,但我还有另一个使用此String创建的表。

 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是一个Asynctask。 这是onPostExecute:

 ** * Method called after execution has happen, passing in the result * * @Override */ protected void onPostExecute(ArrayList 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; } } 

问题已得到解决 – 有重复的条目,但它们被忽略了。 谢谢

查看AsyncTask的onPostExecute()方法,我相信你的结果中至少有一组重复的值。 只需从源代码中清除这些重复项。

或者您可以告诉您的表忽略具有重复条目的行,并通过“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)"; 

nameforeign_word组成此表中的主键(Unique!)键。 您必须尝试插入重复的键控行。 两个字段的组合必须是唯一的。

使用

 db.insertOrThrow(TABLE_VOCAB_WORDS, null, cv); 

由于我忽略的原因,它对我有用。