逻辑必须决定它是insert
还是update
表,但是它必须检查表是否为空。
所以当前版本的代码看起来像这样
if ((new XYZController(mContext)).getCount() == 0) {
new XYZController(mContext).insert(object);
} else {
XYZObject obj = (new XYZController(mContext)).getByString(string);
if (obj == null) {
new XYZController(mContext).insert(object);
} else {
new XYZController(mContext).update(object);
}
}
由于我无法对空SQLite表进行WHERE
查询,因此我必须添加"如果为空"检查。
有没有办法省略这样的流量,如果表格是空的,只需要进行1次插入和1次更新吗?
PS。如果我们尝试在空表上进行WHERE
查询,则应用会在cursor.getString()
public XYZModel getByString(String s) {
String selectQuery = "SELECT * FROM " + TABLE_XYZ
+ " WHERE " + COLUMN + "='" + s + "'";
Cursor cursor = getRow(selectQuery);
XYZModel walk = null;
if (cursor != null) {
cursor.moveToFirst();
obj = new XYZModel(cursor.getString(1), cursor.getString(2),
cursor.getString(3));
}
if (obj == null)
obj = new XYZModel();
return obj;
}
答案 0 :(得分:3)
确保您的表具有合理的唯一性约束,例如某些列上的PRIMARY KEY
或UNIQUE
约束
只需使用带有冲突解决算法的插入,例如替换,例如:
db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
如果插入违反约束,则首先将删除冲突的行,然后插入新行。因此,请确保为每列提供值。
如果您有数据库生成的INTEGER PRIMARY KEY
,您最初可以为其值(NULL
)提供ContentValues.putNull()
,然后捕获插入的返回值以获取生成的主键值。
这样您就不需要(错误的)代码来检查行是否存在,也不需要单独的分支来进行插入和更新。