我知道有一个SQL命令是这样的:IF NOT EXISTS
,但由于Android的SQLiteDatabase
类有一些很好的方法,我想知道是否可以插入一个值,如果它不存在通过一种方法。
目前我正在使用它来插入String
:
public long insertString(String key, String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(key, value);
return db.insert(DATABASE_TABLE, null, initialValues);
}
(db
是SQLiteDatabase
的实例。)
我尝试使用方法insertOrThrow()
而不是insert()
,但它似乎与insert()
相同。也就是说,如果该值已经在行中,则会再次插入该值,因此该行现在具有两个具有相同值的值。
答案 0 :(得分:15)
SQLiteDatabase:仅在值不存在时插入(不通过raw SQL命令)
由于您不想使用原始查询,您可以在插入之前实现它,只需创建一些函数来测试值是否已存在于数据库中。它可以返回boolean(或int),如果返回false,则执行insert查询。
一个小例子:
public int getCount() {
Cursor c = null;
try {
db = Dbhelper.getReadableDatabase();
String query = "select count(*) from TableName where name = ?";
c = db.rawQuery(query, new String[] {name});
if (c.moveToFirst()) {
return c.getInt(0);
}
return 0;
}
finally {
if (c != null) {
c.close();
}
if (db != null) {
db.close();
}
}
}
if (getCount() == 0) {
//perform inserting
}
如果该值已经在行中,则会再次插入,以便现在显示该行 有两个相同值的值。
这可以通过使用适当的约束来解决,这些约束不允许您插入重复项。检查一下:
答案 1 :(得分:12)
您可以为插入行的冲突设置CONFLICT_IGNORE行为:
public long insertString(String key, String value) {
ContentValues initialValues = new ContentValues();
initialValues.put(key, value);
return db.insertWithOnConflict(DATABASE_TABLE, null, initialValues, SQLiteDatabase.CONFLICT_IGNORE);
}
但这取决于约束。如果您将来需要,会有更多行为。
答案 2 :(得分:3)
有两种基本方法可以做到这一点:
CONSTRAINT
s。将SQL架构定义为仅允许此列的唯一数据。如果您想在不同情况下执行不同的操作(或者您还不熟练使用SQL),第一种方法会更容易。第二种方法可以通过更少的输入完成,并且可以普遍应用。
答案 3 :(得分:3)
解决方案不在Android Api中,而在数据库中。如果您想确保您插入的字符串尚未存在于数据库中,则有两种可能的解决方案。
在创建数据库时,将列(您要插入的字符串)设置为UNIQUE
,这将阻止它将重复项输入到该列中。并且当您尝试插入并且是重复时,它将引发错误;你可以通过异常处理来处理它。
您可以创建第二个方法(在每次插入后调用;这很昂贵),检查表中的重复项并将其删除。
我会选择方法1.
这是一个示例UNIQUE
语法
create table tablename( col1 datatype, col2 datatype, col3 datatype, UNIQUE(col1));