在后台服务中从 Android Room 数据库中读取数据,没有例外,但没有数据



我正在尝试从后台服务中的Android Room数据库中读取数据。没有异常,但不返回任何数据。

我编写了一个函数来从 DAO 中的表中选择所有行。从后台服务调用该函数会成功,但不返回任何数据。

我的"联系人"类保存联系信息(姓名、电话号码、电子邮件(并定义数据库架构。该数据库包含联系人行,以姓名,电话号码,电子邮件作为列。

在DAO 中返回 LiveData 的函数是:

@Query("SELECT * FROM contacts_table")
LiveData<List<Contact>> getAll();

其中"contacts_table"是保存联系信息的数据库表。

我按如下方式调用getAll:

AppDatabase db = AppDatabase.getDatabase(messageSenderContext.getApplicationContext());
mContactDAO = db.contactDAO();
mAllContacts = mContactDAO.getAll();

其中mContactDao是一个ContactDAO(我的Contact类的数据库访问对象(,mAllContacts是一个LiveData>。这些是调用 getAll(( 的类的私有字段。

db.contactDAO(( 返回一个对象,mContactDAO.getAll(( 也是如此。但是尝试使用 mAllContacts.getValue(( 从 mAllContacts 中解压缩列表将返回 null。

这被证明是对LiveData的滥用。这需要观察者实际获取数据。

在你的房间里

@Database(entities={Contact.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
public static final String DATABASE_NAME = "AppDatabase.db";
private static volatile AppDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
public static final ExecutorService EXECUTOR_SERVICE = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public abstract ContactDAO contactDAO();
public static AppDatabase getDatabase(final Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, DATABASE_NAME)
.build();
}
}
}
return INSTANCE;
}
}

在你的 DAO 中

@Dao
public interface ContactDAO{
@Query("SELECT * FROM contacts_table")
LiveData<List<Contact>> getAll();
}

在您的存储库中:

public class AppRepository {
private ContactDAO mContactDAO;
//constructor
public AppRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mContactDAO= db.contactDAO();
}
public LiveData<List<Contact>> getAllContacts(){
LiveData<List<Contact>> contactsList = null;
Future<LiveData<List<Contact>>> futureList = AppDatabase.EXECUTOR_SERVICE.submit(new Callable(){
@Override
public LiveData<List<Contact>> call() {
return contactDAO.getAll();
}
});
try {
contactsList = futureList.get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return contactsList ;
}
}

在您的视图中模型

public class ContactsViewModel extends AndroidViewModel {
private AppRepository appRepository;
private LiveData<List<Contact>> contactsList;
public ContactsViewModel(@NonNull Application application) {
super(application);
appRepository = new AppRepository(application);
}
public LiveData<List<Contacts>> list() {
return appRepository.getAllContacts();
}
}

在您的活动中(在创建放置内部(

ContactsViewModel contactsViewModel = new ViewModelProvider(this).get(ContactsViewModel.class);
contactsViewModel.list().observe(getViewLifecycleOwner(), new Observer<List<Contact>>() {
@Override
public void onChanged(List<Contact> contactsList) {
//the contact list will be observed and will return data if there are changes.
//use for example to feed the adapter of a recyclerview
//below an example just to view the contacts data
for(Contact conctact : contactsList){
Log.d("TestApp>>>", "Id: + contact.getId);
Log.d("TestApp>>>", "Name: + contact.getName);   
}
});

最新更新