所以我希望用户能够更新我的表格。除了默认的_ID
列,我还有一个NAME
列,我声明它是唯一的,并且是我用于行的标识符。
现在,出于测试目的,我将相同的值插入表中。出于某种原因,我发现在使用insert(String table, String nullColumnHack, ContentValues values)
方法时,表格已经重复了行。
但是,当我使用insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm)
(其中int conflictAlgorithm
为SQLiteDatabase.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列ID
和NAME
这就是我得到的:
_id: 1, name: abc
_id: 2, name: def
_id: 3, name: ghi
_id: 4, name: abc
_id: 5, name: def
_id: 6, name: ghi
insertWithOnConflict
和SQLiteDatabase.CONFLICT_IGNORE
约束,只是我想要的第一个:
_id: 1, name: abc
_id: 2, name: def
_id: 3, name: ghi
我是否错误地创建了表格,或者为什么这不适用于标准插入方法?如何正确创建表格?或者我被迫与insertWithOnConflict
合作?