为什么我能够将重复的值插入到唯一列中

时间:2015-10-25 16:41:08

标签: android android-sqlite

所以我希望用户能够更新我的表格。除了默认的_ID列,我还有一个NAME列,我声明它是唯一的,并且是我用于行的标识符。

现在,出于测试目的,我将相同的值插入表中。出于某种原因,我发现在使用insert(String table, String nullColumnHack, ContentValues values)方法时,表格已经重复了行。

但是,当我使用insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm)(其中int conflictAlgorithmSQLiteDatabase.CONFLICT_IGNORE)时,这种情况不会发生。

基本上,这是我创建表格的翻译方式:

"CREATE TABLE " + TABLE_NAME + " (" +
            _ID + " INTEGER PRIMARY KEY," +
            COLUMN_NAME_NAME + " TEXT NOT NULL ON CONFLICT REPLACE, " + 
            COLUMN_NAME_STATS + " TEXT," +
            COLUMN_NAME_ABILITIES + " TEXT," +
            COLUMN_NAME_PICTURE + " TEXT," +
            " UNIQUE(" + COLUMN_NAME_NAME + ")" + "ON CONFLICT REPLACE" +
            ")";

我也在语句末尾没有UNIQUE()...子句的情况下尝试过,但是使用COLUMN_NAME_NAME + " TEXT UNIQUE ON CONFLICT REPLACE , " +声明。

为简化起见,这是我插入的内容(我只插入名称):

ContentValues cv;
SQLiteDatabase db = dbHelper.getWritableDatabase();
for(String t : someListOfStrings)
   cv.put(MyDBContract.MyDatabase.COLUMN_NAME_NAME,t);  //Where t from {"abc","def","ghi"}
db.insert(MyDBContract.MyDatabase.TABLE_NAME, null, cv);

我正在通过"select * from " + MyDBContract.MyDatabase.TABLE_NAME填充我的输出,在这种情况下只有2列IDNAME

这就是我得到的:

_id: 1, name: abc
_id: 2, name: def
_id: 3, name: ghi
_id: 4, name: abc
_id: 5, name: def
_id: 6, name: ghi

insertWithOnConflictSQLiteDatabase.CONFLICT_IGNORE约束,只是我想要的第一个:

_id: 1, name: abc
_id: 2, name: def
_id: 3, name: ghi

我是否错误地创建了表格,或者为什么这不适用于标准插入方法?如何正确创建表格?或者我被迫与insertWithOnConflict合作?

0 个答案:

没有答案