【发布时间】:2026-02-08 08:40:01
【问题描述】:
我是 Room、Rxjava 和其他 android 架构组件的新手。我正在尝试更新/插入 2 条记录(如果行已经存在,请更新它。否则插入一个新行。)我尝试按以下方式进行操作。但是,我没有工作。
游戏活动:
public class GameActivity extends AppCompatActivity {
...
public void onGameWinnerChanged(Player winner) {
mDisposable.add(gameViewModel.updateDb(winner)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> Log.e("Success!!!", "updated records")
, throwable -> {
throwable.printStackTrace();
}));
}
}
GameViewModel:
public class GameViewModel extends ViewModel {
...
public Completable updateDb(Player winner) {
return Completable.fromAction(() -> {
updateWinner(winner);
Player loser = game.player1 == winner ? game.player2 : game.player1;
updateLoser(loser);
});
}
private void updateLoser(Player loser) {
User user = userDataSource.getSingleRecordFromName(loser.name);
if (user != null) {
user.loss++;
userDataSource.updateRecord(user);
} else {
user = new User(loser.name, "", 0, 0, 1);
userDataSource.insertOrUpdateUser(user);
}
}
private void updateWinner(Player winner) {
User user = userDataSource.getSingleRecordFromName(winner.name);
if (user != null) {
user.wins++;
userDataSource.updateRecord(user);
} else {
user = new User(winner.name, "", 0, 1, 0);
userDataSource.insertOrUpdateUser(user);
}
}
}
LocalUserDataSource
public class LocalUserDataSource implements UserDataSource {
private DaoAccess daoAccess;
public LocalUserDataSource(DaoAccess daoAccess){
this.daoAccess=daoAccess;
}
@Override
public Flowable<List<User>> getUsers() {
return daoAccess.fetchAllData();
}
@Override
public void insertOrUpdateUser(User user) {
Log.e("local user ds","insertOrUpdateUser");
daoAccess.insertOnlySingleRecord(user);
}
@Override
public User getSingleRecordFromName(String strName) {
return daoAccess.getSingleRecord(strName);
}
@Override
public void updateRecord(User user) {
daoAccess.updateRecord(user);
}
@Override
public void deleteRecord(User user) {
daoAccess.deleteRecord(user);
}
}
DaoAccess
@Dao
public interface DaoAccess {
@Insert
void insertOnlySingleRecord(User user);
@Query("SELECT * FROM User")
Flowable<List<User>> fetchAllData();
@Query("SELECT * FROM User WHERE name =:strName")
User getSingleRecord(String strName);
@Update
void updateRecord(User user);
@Delete
void deleteRecord(User user);
}
问题是,当我尝试运行时,如果我尝试在 GameViewModel 类的下一行插入任何不在数据库中的用户,则会出现 NullPointer 异常。
User user = userDataSource.getSingleRecordFromName(loser.name);
谁能告诉我哪里错了或者我该怎么办?
编辑
我想要做的是首先获取一个用户,如果它在数据库中,更新递增或递减分数(如果获胜者则 +1 获胜列,如果失败者则 +1 损失列)。 如果用户在表中不存在,则创建一个新条目。
【问题讨论】:
-
@Insert(onConflict = OnConflictStrategy.REPLACE) void insertOnlySingleRecord(User user);你可以像这样更新或替换。在你的`DaoAccess`中 -
@KuLdipPaTel 请查看已编辑的问题
-
@KuLdipPaTel 那么,在这种情况下获取单个记录的查询应该是什么?
-
首先您要防止插入重复条目,其次如果您的玩家名称包含空格,您必须在
getSingleRecord查询中更改。 -
你能解释更多吗?我将如何实现这一目标? @KuLdipPaTel
标签: android rx-java2 android-room android-mvvm