防止SQLite Android中的重复数据

防止SQLite Android中的重复数据,android,android-sqlite,Android,Android Sqlite,我正在使用Sqlite在登录后保存一个google帐户,我想在我点击两次save按钮时防止重复。我在这里搜索并使用了insertWithOnConflict,但仍然不起作用。我想是因为我的ID是自动递增的。那我该怎么办呢 DBHelper.java public class DBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "Account"; private static final Strin

我正在使用Sqlite在登录后保存一个google帐户,我想在我点击两次save按钮时防止重复。我在这里搜索并使用了
insertWithOnConflict
,但仍然不起作用。我想是因为我的ID是自动递增的。那我该怎么办呢

DBHelper.java

public class DBHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "Account";
private static final String TABLE_NAME = "User";
private static final String ID = "Id";
private static final String Name = "name";
private static final String Email = "email";
private static final String Avatar = "avatar";
private static final String UserId = "userid";
private static final String TokenId = "tokenid";

private String SQLQuery = "CREATE TABLE " +TABLE_NAME+" ("+
        ID +" integer primary key, "+
        Name + " TEXT, "+
        Email + " TEXT, "+
        Avatar + " TEXT, "+
        UserId + " TEXT, "+
        TokenId + " TEXT)";


public DBHelper(Context context) {
    super(context, DB_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    sqLiteDatabase.execSQL(SQLQuery);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}

public void addUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(Name, user.getmName());
    values.put(Email, user.getmEmail());
    values.put(Avatar, user.getmAvatar());
    values.put(UserId, user.getmUserID());
    values.put(TokenId, user.getmTokenID());

    db.insertWithOnConflict(TABLE_NAME, null, values,SQLiteDatabase.CONFLICT_REPLACE);
    db.close();
}

第一个解决方案,您可以使用
选择
,检查数据库中是否存在行,然后使用
更新
查询编辑数据库中的数据。相反,您将使用
INSERT
将数据插入数据库。第二个解决方案是,您可以使用一些SQLite库,例如DBFlow、GreenDAO等。然后使用
。使用相同的函数保存
方法。

在防止重复数据之前,您必须定义“唯一性”。在你的情况下,我猜是
电子邮件

即使使用
insertWithOnConflict
插入数据,在创建表时,也没有指定哪个列是唯一的。默认情况下,它将是自动递增的主键,因此插入的每个记录都是一个新的。

例如(在
email
列上):

private String SQLQuery = "CREATE TABLE " +TABLE_NAME+" ("+
        ID +" integer primary key, "+
        Name + " TEXT, "+
        Email + " TEXT UNIQUE, "+
        Avatar + " TEXT, "+
        UserId + " TEXT, "+
        TokenId + " TEXT)";