在SQLite Android中防止重复数据

时间:2018-08-20 00:14:55

标签: android android-sqlite

登录后,我正在使用Sqlite保存一个Google帐户,我想防止重复单击两次“保存”按钮。我在这里搜索并使用了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();
}

2 个答案:

答案 0 :(得分:0)

第一个解决方法是,可以使用SELECT,检查数据库中是否存在行,然后将使用UPDATE查询来编辑数据库中的数据。相反,您将使用INSERT将数据插入数据库。第二个解决方法是,您可以使用一些库SQLite,例如然后,DBFlow,GreenDAO等使用具有相同功能的.save方法。

答案 1 :(得分:0)

在防止重复数据之前,您必须定义“唯一性”。就您而言,我猜是email
即使使用insertWithOnConflict插入了数据,在创建表时,也没有指定哪一列是UNIQUE。默认情况下,它将是您的自动增量主键,因此插入的每个记录都是一个新的。

一个示例可能像(在email列上):

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