使用LiveData或MutableLiveData观察数据库的单个条目

问题描述 投票:0回答:1

我目前正在开发一个应用,该应用需要观察数据库中一个条目的更改。该应用程序的结构如下:我的MainActivity是一个RecyclerView,列出了DB中的所有朋友。单击一个项目/朋友时,将启动该朋友的个人资料(ProfileActivity),其中包括一个用于打开编辑器以编辑姓名,生日,图像等的按钮。当用户完成编辑后,新数据将保存到DB中,并且EditActivity关闭并该应用程序返回到ProfileActivity。在这里我要显示更改。

我尝试了LiveData和MutableLiveData。在这两种情况下,我都使用Activity-ViewModel-Repository-Dao的通用结构。使用LiveData,我的Dao.findBy(friendId)返回LiveData,使用MutableLiveData,我的Dao.findBy(friendId)返回FriendEntity。MutableLiveData的问题在于无法直接观察数据库中的更改。而使用LiveData的问题是,必须以某种方式初始化我的存储库中的LiveData字段,以便Activity可以观察它。但是LiveData无法手动初始化-因此我得到了NullPointerException。

我尝试在onCreate上调用Dao.findBy(-1)来初始化我的LiveData,并且一旦我知道实际的friendId,我便再次调用它,但是onChanged不再触发。

是否有解决该问题的好方法?还有另一种初始化LiveData的方法吗?为什么第二次我调用Dao.findBy(friendId)(在调用Dao.findBy(-1)之后)不会触发onChanged

活动:

public class ProfileActivity extends AppCompatActivity {
    MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mutable_live_data);

        viewModel = new ViewModelProvider(this).get(MyViewModel.class);

        viewModel.getFoundFriend().observe(this, new Observer<FriendEntity>() {
            @Override
            public void onChanged(FriendEntity friendEntity) {
                if (friendEntity != null){
                    FriendEntity friend = friendEntity.getName();
                    textViewData.setText(name);
                }
             }
        });
    }
}

ViewModel:

public class MyViewModel extends AndroidViewModel {

NormalRepository repository;
LiveData<FriendEntity> foundFriend;

public NormalViewModel(@NonNull Application application) {
    super(application);
    repository = new NormalRepository(application);
    foundFriend = repository.getFoundFriend();
}

public LiveData<FriendEntity> getFoundFriend() {
    return foundFriend;
}

public void find(long id) {
    repository.find(id);
}
}

存储库:

public class NormalRepository {

MyDao dao;
LiveData<FriendEntity> foundFriend;

public NormalRepository(Application application) {
    Database database = Database.getInstance(application);
    this.dao = database.normalDao();

    foundFriend = dao.findBy(-1L);
}

public void find(long id) {
    new FindAsyncTask(dao).execute(id);
}

private class FindAsyncTask extends AsyncTask<Long, Void, LiveData<FriendEntity>>{
    NormalDao dao;

    public FindAsyncTask(NormalDao dao) {
        this.dao = dao;
    }

    @Override
    protected LiveData<FriendEntity> doInBackground(Long... longs) {

        foundFriend = null;

        return dao.findBy(longs[0]);
    }

    @Override
    protected void onPostExecute(LiveData<FriendEntity> friendEntityLiveData) {
        foundFriend = friendEntityLiveData;
    }
}

public LiveData<FriendEntity> getFoundFriend() {
    return foundFriend;
}
}

Dao:

@Dao
public interface MyDao {

@Query("SELECT * FROM friend_table WHERE id=:id")
LiveData<FriendEntity> findBy(long id);

}
    

我目前正在开发一个应用,该应用需要观察数据库中一个条目的更改。该应用程序的结构如下:My MainActivity是一个RecyclerView,列出了DB中的所有朋友。单击时...

java android android-livedata observers mutablelivedata
1个回答
0
投票

为什么onChanged不会在我第二次调用Dao.findBy(friendId)(在调用Dao.findBy(-1)之后)没有触发

© www.soinside.com 2019 - 2024. All rights reserved.