gpt4 book ai didi

android - 如何处理 Android Room 和 RxJava2 没有结果?

转载 作者:可可西里 更新时间:2023-11-01 19:09:31 25 4
gpt4 key购买 nike

我有一个包含表联系人的数据库,我想检查是否有某个电话号码的联系人。

@Query("SELECT * FROM contact WHERE phone_number = :number")
Flowable<Contact> findByPhoneNumber(int number);

我有 RxJava 2 Composite disposable 和上面的语句来检查是否有联系电话号码。

disposable.add(Db.with(context).getContactsDao().findByPhoneNumber(phoneNumber)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSubscriber<Contact>() {
@Override
public void onNext(final Contact contact) {
Log.d("TAG", "phone number fined");
Conversation conversation;
if(contact != null){
conversation = Db.with(context).getConversationsDao().findBySender(contact.getContactId());
if(conversation != null){
conversation.setUpdatedAt(Utils.getDateAndTimeNow());
saveConversation(contact, conversation, context, text, phoneNumber, false);
} else {
conversation = getConversation(contact, contact.getPhoneNumber());
saveConversation(contact, conversation, context, text, phoneNumber, true);
}
} else {
conversation = Db.with(context).getConversationsDao().findByPhone(phoneNumber);
if(conversation != null){
conversation.setUpdatedAt(Utils.getDateAndTimeNow());
saveConversation(contact, conversation, context, text, phoneNumber, false);
} else {
conversation = getConversation(contact, phoneNumber);
saveConversation(contact, conversation, context, text, phoneNumber, true);
}
}
}

@Override
public void onError(Throwable t) {
Log.d("TAG", "find phone number throwable");
Toast.makeText(context, t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}

@Override
public void onComplete() {
Log.d("TAG", "onComplete");
}
}));

如果查询可以找到具有所需电话号码的联系人,这工作正常,但如果有结果,则什么也不会发生。

这是我编写的两个测试用例,它们运行良好:

@RunWith(AndroidJUnit4.class)
public class ContactsTest {

private AppDatabase db;

@Rule
public InstantTaskExecutorRule instantTaskExecutorRule =
new InstantTaskExecutorRule();

@Before
public void initDb() throws Exception {
db = Room.inMemoryDatabaseBuilder(
InstrumentationRegistry.getContext(),
AppDatabase.class)
// allowing main thread queries, just for testing
.allowMainThreadQueries()
.build();
}

@After
public void close(){
db.close();
}

@Test
public void insertAndFindTest(){
final Contact contact = new Contact();
contact.setName("Test");
contact.setPhoneNumber(555);
db.contactsDao()
.insert(contact);

db.contactsDao().findByPhoneNumber(contact.getPhoneNumber())
.test()
.assertValue(new Predicate<Contact>() {
@Override
public boolean test(@NonNull Contact savedContact) throws Exception {
if(savedContact.getPhoneNumber() == contact.getPhoneNumber()){
return true;
}
return false;
}
});
}

@Test
public void findNoValues(){
db.contactsDao().findByPhoneNumber(333)
.test()
.assertNoValues();
}

}

我该如何解决这个问题?

最佳答案

如前所述here ,对于这种情况,您可以使用 MaybeSingle:

也许

@Query("SELECT * FROM Users WHERE id = :userId")
Maybe<User> getUserById(String userId);

这是发生了什么:

  • 当数据库中没有用户并且查询没有返回任何行时,Maybe 将完成。
  • 当数据库中有用户时,Maybe会触发onSuccess并完成。
  • 如果用户在 Maybe 完成后更新,则什么也不会发生。

单例

@Query("SELECT * FROM Users WHERE id = :userId")
Single<User> getUserById(String userId);

以下是一些场景:

  • 当数据库中没有用户且查询没有返回行时,Single会触发onError(EmptyResultSetException.class)
  • 当数据库中有用户时,Single会触发onSuccess。
  • 如果在调用 Single.onComplete 后更新了用户,则不会发生任何事情,因为流已完成。

它是在 1.0.0-alpha5 版本中添加的。

关于android - 如何处理 Android Room 和 RxJava2 没有结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44945285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com