Skip to content

更新数据(Update)

更新数据库中的已有数据。使用的注解是@Update

实体类UserPrimaryKey只有一个uid

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    public long uid;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;

    @ColumnInfo
    public long createTime;
}

在Dao中给方法加上注解。

@Dao
public interface UserDao {
    @Update
    void updateOneUser(User user);

    @Update
    int updateOneUserAndResult(User user);
}

方法可以返回空。也可以返回int。

如果返回int,表示执行更新成功的数量。

如果要更新多条数据,可以传入多个对象

    @Update(onConflict = OnConflictStrategy.ABORT)
    int updateUsersCanAbort(User... user);

    @Update(onConflict = OnConflictStrategy.IGNORE)
    int updateUsersCanIgnore(User... user);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    int updateUsersCanReplace(User... user);

onConflict有3个参数,默认是ABORT。这些参数与添加数据的参数一样。

返回值int表示执行更新操作成功的行数(对象数)。

假设要更新4个User对象,但实际上只更新了3个,则@Update的方法返回3

    @NotNull
    private User[] getUsers() {
        User[] users = new User[4];
        for (int i = 1; i < 4; i++) {
            final int uid = i + 1;
            User user = new User("Rust", "Fisher-" + uid);
            user.uid = uid;
            user.createTime = 54898 + i; // 假的时间
            users[i] = user;
        }
        User fakeUser = new User("fake", "user");
        fakeUser.uid = 100;
        users[0] = fakeUser; // 一个假的数据
        return users;
    }

// 尝试更新数据
User[] users = getUsers();
UserDao userDao = DbMgr.getMgr().getDatabase().userDao();
int res = userDao.updateUsersCanReplace(users);
Log.d(TAG, "updateManyCanReplace: " + res);

注意:这里的UserPrimaryKey只有一个uid

根据uid来判断这一条数据是否要被更新。