我希望在这里删除一个重复的行(例如,Jim 21)
SQLiteDatabase myDataBase=this.openOrCreateDatabase("Users",MODE_PRIVATE,null);
myDataBase.execSQL("CREATE TABLE IF NOT EXISTS users (name VARCHAR,age INT(3))");
myDataBase.execSQL("INSERT INTO users(name,age) VALUES ('Rob', 34)");
myDataBase.execSQL("INSERT INTO users(name,age) VALUES ('Nat', 22)");
myDataBase.execSQL("INSERT INTO users(name,age) VALUES ('Jim', 21)");
myDataBase.execSQL("DELETE FROM users WHERE name='Jim'");
Cursor c=myDataBase.rawQuery(" SELECT * FROM users", null);
int nameIndex=c.getColumnIndex("name");
int ageIndex=c.getColumnIndex("age");
c.moveToFirst();
while (c!=null){
Log.i("name",c.getString(nameIndex));
Log.i("age",Integer.toString(c.getInt(ageIndex)));
c.moveToNext();
}
我试过这个
myDataBase.execSQL("DELETE FROM users WHERE name='Jim' LIMIT 1");
但它抛出了语法错误。我知道LIMIT
在语法上不允许在android中。那么如果有重复的话,我怎么才能删除一条吉姆的记录呢?
谢谢。
答案 0 :(得分:0)
Limit
不适用于Delete
查询,仅适用于Select
条记录数
更新查询
myDataBase.execSQL("DELETE FROM users WHERE name='Jim'");
您可以添加更多条件以删除特定记录
myDataBase.execSQL("DELETE FROM users WHERE name='Jim' AND age=21 ");
答案 1 :(得分:0)
有几种方法可以实现这一目标。不过,我建议在unique
字段上加上name
约束。
myDataBase.execSQL("CREATE TABLE IF NOT EXISTS users (name text unique not null, age INT(3))");
现在,要在users
表中创建新条目,请获取如下函数。
public void createUser(List<User> userList) {
if (userList != null && !userList.isEmpty()) {
SQLiteDatabase db = this.openOrCreateDatabase("Users",MODE_PRIVATE,null);
db.beginTransaction();
try {
for (User user : userList) {
ContentValues values = new ContentValues();
values.put("name", user.getName());
values.put("age", user.getAge());
// Replace on conflict with the unique constraint
db.insertWithOnConflict("users", null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
} catch (Exception e) {
e.printStackTrace();
}
db.setTransactionSuccessful();
db.endTransaction();
}
}
通过这种方式,您不必删除表中的任何重复行,因为也不会有重复的行。
但是,如果您的实现需要重复行,然后在尝试根据某些条件删除时只删除第一行,那么您可以考虑使用sqlite内置列ROWID
。您将获得符合条件的所有行,并保存所有行ROWID
。然后删除与要删除的ROWID
匹配的行。
delete from users where ROWID = 9
这里是使用ROWID的Plugging in Your Own Test Execution Listeners。
答案 2 :(得分:0)
我将采用的方法是创建一个表,在插入数据时自动解析重复项。制作&#34;名称&#34;字段主键。这是CREATE语句:
CREATE TABLE users (name TEXT PRIMARY KEY ON CONFLICT IGNORE,age INTEGER);
&#34;关于冲突IGNORE&#34;将始终保持第一个&#34;名称&#34;记录在数据库中。如果要始终保持插入最后一条记录,请使用&#34; ON CONFLICT REPLACE&#34;。例如:
INSERT INTO users VALUES ('Jim','21');
INSERT INTO users VALUES ('Jim','23');
INSERT INTO users VALUES ('Jim','43');
如果您使用&#34; ON CONFLICT IGNORE&#34;然后&#34; SELECT * FROM users&#34;会产生&#34;吉姆| 21&#34;。如果您使用&#34; ON CONFLICT REPLACE&#34;然后&#34; SELECT * FROM users&#34;会产生&#34;吉姆| 43&#34;。