当前位置: 首页 > 知识库问答 >
问题:

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

钱德海
2023-03-14
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);
                }
             }
        });
    }
}
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
public interface MyDao {

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

}

共有1个答案

辛渝
2023-03-14

我对Java有点生疏,因为我使用的是Kotlin,但在我看来:

FindAsyncTask无用。如果从查询返回LiveData,则可以在主线程上运行。您不需要使用后台线程。实际上,该函数立即返回LiveData(内容为null值),然后使用后台线程执行查询并更新LiveData。在这一点上,你得到了你的价值。现在,忘掉您的案例中的MutableLiveData。这是如果您需要更新自己的值,但在这种情况下,Room会处理这一点。所以回购会是这样的:

public class NormalRepository {
    MyDao dao;

    // you probably can transform all in a one liner, i bet you need just a context there, not application
    public NormalRepository(Application application) {
        Database database = Database.getInstance(application);
        this.dao = database.normalDao();    
    }

    public LiveData<FriendEntity> find(long id) {
        new dao.findBy(id);
    }
}

ViewModel只需要调用查询并存储LiveData

public class MyViewModel extends AndroidViewModel {

NormalRepository repository;
LiveData<FriendEntity> foundFriend;

// When you create the view Model you should already know what is the id
public NormalViewModel(@NonNull Application application, long id) {
    super(application);
    repository = new NormalRepository(application);
    foundFriend = repository.repository.find(id);
}

public LiveData<FriendEntity> getFoundFriend() {
    return foundFriend;
}
}
public class ProfileActivity extends AppCompatActivity {
    MyViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mutable_live_data);
        if(savedInstanceState != null)
            long id = savedInstanceState.getLong("MyLong")
        viewModel = new ViewModelProvider(this,ViewModelFactory(application, id)).get(MyViewModel.class);

        viewModel.getFoundFriend().observe(this, new Observer<FriendEntity>() {
            @Override
            public void onChanged(FriendEntity friendEntity) {
                if (friendEntity != null){
                    String name = friendEntity.getName();
                    textViewData.setText(name);
                }
             }
        });
    }
}
 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 问题是: 使用及其其他功能不是更好吗?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我试图在下面的代码中找出,为什么当我用新数据填充数据库时,Room的LiveData observable没有给我新的班次。 这是放在我的activity的onCreate方法上的: 这是populateAdapter方法: 我还有以下填充数据库的代码(我使用RxJava在IO线程上完成这项工作,因为Room需要在主线程之外调用它的代码): 当我开始观察ShiftsViewModel之后调用per

  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法