删除sqlite中的一个重复行

时间:2018-03-30 06:34:48

标签: android sqlite

我希望在这里删除一个重复的行(例如,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中。那么如果有重复的话,我怎么才能删除一条吉姆的记录呢?

谢谢。

3 个答案:

答案 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;。