Android 对SQLite进行插入或更新,处理空表
逻辑必须决定是插入表还是更新表,但必须检查表是否为空 因此,代码的当前版本如下所示Android 对SQLite进行插入或更新,处理空表,android,android-sqlite,Android,Android Sqlite,逻辑必须决定是插入表还是更新表,但必须检查表是否为空 因此,代码的当前版本如下所示 if ((new XYZController(mContext)).getCount() == 0) { new XYZController(mContext).insert(object); } else { XYZObject obj = (new XYZController(mContext)).getByString(string); if (obj == null) {
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
查询,所以我必须进行额外的“if empty”检查
有没有一种方法可以忽略这样的流,只进行1次插入和1次更新,而不管表是否为空
另外,如果我们试图对空表进行WHERE
查询,应用程序将在游标上中断。getString()
主键
或唯一性
约束db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
整数主键
,您可以首先为其值(ContentValues.putNull()
)提供一个NULL
,然后捕获插入的返回值以获取生成的主键值
这样,您就不需要检查行是否存在的(错误)代码,也不需要为插入和更新使用单独的分支
主键
或唯一性
约束db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
整数主键
,您可以首先为其值(ContentValues.putNull()
)提供一个NULL
,然后捕获插入的返回值以获取生成的主键值
这样,您就不需要检查行是否存在的(错误)代码,也不需要为插入和更新使用单独的分支
主键
或唯一性
约束db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
整数主键
,您可以首先为其值(ContentValues.putNull()
)提供一个NULL
,然后捕获插入的返回值以获取生成的主键值
这样,您就不需要检查行是否存在的(错误)代码,也不需要为插入和更新使用单独的分支
主键
或唯一性
约束db.insertWithOnConflict(tableName, null, contentValues, SQLiteDatabase.CONFLICT_REPLACE);
整数主键
,您可以首先为其值(ContentValues.putNull()
)提供一个NULL
,然后捕获插入的返回值以获取生成的主键值
这样,您就不需要检查行是否存在的(错误)代码,也不需要为插入和更新使用单独的分支。您只需使用
替换为。如果记录存在,它将被替换,如果不存在,它将被插入。您需要通过execSQL()
REPLACE-to
运行它,它也称为INSERT或REPLACE
。如果要保留现有行(如果该行通过其主键存在),则还有插入或忽略。因为我不能在空的SQLite表上执行WHERE查询,所以我必须进行额外的“if empty”检查——嗯WHERE
将为空表返回零行,就像它将为非空表返回零行,但与WHERE
子句不匹配一样。“如果我们尝试对空表进行WHERE查询,应用程序将在光标上中断。getString()--这是因为您看不到您的光标是否有任何行。@commonware谢谢。我修复了一个检查0行的光标。我的问题是,我是否应该完全停止使用SQLite中的UPDATE
并切换到INSERT或REPLACE
?“我的问题是,我是否应该完全停止使用SQLite中的UPDATE并切换到INSERT或REPLACE?”--我无法回答这个问题,因为我不知道您的业务规则insertWithOnConflict()
基本上是insert()
的一种风格,它允许相同类型的冲突解决,因此您可以使用公认的答案,如果这是您的意思的话。但是正确的冲突解决策略是什么(忽略、替换等)取决于您。您只需使用替换为。如果记录存在,它将被替换,如果不存在,它将被插入。您需要通过execSQL()
REPLACE-to
运行它,它也称为INSERT或REPLACE
。如果要保留现有行(如果该行通过其主键存在),则还有插入或忽略。因为我不能在空的SQLite表上执行WHERE查询,所以我必须添加“if empty”