【问题标题】:Android SQLite Columns ..... are not uniqueAndroid SQLite 列......不是唯一的
【发布时间】:2014-07-04 17:35:07
【问题描述】:

我在 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;
    }
}

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

【问题讨论】:

  • "为什么我在添加内容时会出现错误??"你想添加什么?是重复的吗?
  • 为空不能重复。
  • 你在添加什么:一行,多行? (发布您的onUpgrade() 方法。)如果您要删除数据库,为什么还要调用onUpgrade()?逻辑认为应该调用onCreate()。请发布完整的堆栈跟踪。
  • 好的 - 我在之后添加了 database.delete
  • 除非您将代码发布到您试图将单词插入表中的位置,否则我无法帮助您...此外,您的 Logcat 也没有提及 onUpgrade(),问题在 ImportVocabList 和 @ 之间987654332@。 发布此代码。

标签: java android sql


【解决方案1】:

查看您的 AsyncTask 的 onPostExecute() 方法,我相信您在 result 中至少有一组重复的值。只需从源中清除这些重复项即可。

或者您可以tell your table 忽略具有重复条目的行并通过"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)";

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 确定...您没有对表应用任何其他约束是吗?
    • 约束是什么意思? (我是 SQL 菜鸟)我在桌子上只有操作中的那个字符串
    • 对表数据的任何约束(主键约束该列是唯一的,您可以约束列只包含某些数据(如YesNo
    • 不。我所定义的只是我在那个字符串中所拥有的
    • 约束错误与数据相关。我怀疑您的 CREATE_TABLE_xxx 有效,并且您正在加载数据(您可以在其中放入 Log.d() 吗?)
    【解决方案3】:

    使用

    db.insertOrThrow(TABLE_VOCAB_WORDS, null, cv);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2012-11-03
      • 2021-11-20
      相关资源
      最近更新 更多