Я новичок в 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();
}));
}
}
Модель GameView:
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);
}
}
}
Источник данных пользователя
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);
}
Проблема в том, что когда я пытаюсь запустить, возникают исключения NullPointer, если я пытаюсь вставить любого пользователя, которого нет в базе данных, в следующую строку класса GameViewModel.
User user = userDataSource.getSingleRecordFromName(loser.name);
Может ли кто-нибудь сказать мне, где я не прав или что мне делать?
Изменить
Что я хочу сделать, так это сначала получить пользователя, если он есть в базе данных, обновить, увеличить или уменьшить счет (если победитель, то +1 к столбцу побед, если проигравший, то +1 к столбцу проигрыша). Если пользователь не существует в таблице, создайте новую запись.
@Insert(onConflict = OnConflictStrategy.REPLACE) void insertOnlySingleRecord(User user);
можно обновить или заменить вот так. в вашем `DaoAccess` - person KuLdip PaTel   schedule 14.04.2018getSingleRecord
запросе. - person KuLdip PaTel   schedule 14.04.2018