我目前正在开发一个应用,该应用需要观察数据库中一个条目的更改。该应用程序的结构如下:我的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中的所有朋友。单击时...
为什么onChanged不会在我第二次调用Dao.findBy(friendId)(在调用Dao.findBy(-1)之后)没有触发