【发布时间】:2020-11-17 11:39:17
【问题描述】:
我正在使用 Roomdatabase,当我给出它的名称时,我希望搜索从数据库中获取单个对象。为此,我在 DAO 中编写了此查询:
@Query("SELECT * FROM kuh_table WHERE name = :kuhName ")
Kuh findKuh(String kuhName);
我在存储库中这样称呼它:
public Kuh findKuh(String kuhName){
final Kuh[] kuh = new Kuh[1];
new Thread(new Runnable() {
volatile boolean running = true;
@Override
public void run() {
if(running!= true) {
return;
}
kuh[0] =kuhDAO.findKuh(kuhName);
running = false;
}
}).start();
return kuh[0];
}
然后在我的 ViewModel 中这样:
public Kuh findKuh(String kuhName){ return repository.findKuh(kuhName);}
然后我在片段中初始化我的 ViewModel 并尝试通过提供这样的字符串来使用该方法:
MarkerApiKt.setMarkerTapListener(mapView, (MarkerTapListener) (new MarkerTapListener() {
public void onMarkerTap(@NotNull View view, int x, int y) {
Intrinsics.checkNotNullParameter(view, "view");
if (view instanceof MapMarker) {
MarkerCallout callout = new MarkerCallout(context);
callout.setTitle(((MapMarker) view).getName());
callout.setSubTitle("position: " + ((MapMarker) view).getX() + " , " + ((MapMarker) view).getY());
Kuh kuh = kuhViewModel.findKuh(((MapMarker) view).getName());
Toast.makeText(context, "this is "+ kuh.getName(), Toast.LENGTH_SHORT).show();
但不知何故,我的对象的 istance 始终为空,因为我最终得到了一个空指针异常。 知道我做错了什么吗?
【问题讨论】:
-
你正在启动一个新线程,它应该从你的 DAO 中获取对象。此代码在另一个线程上运行,因此程序不会等待它完成。调用 thread.start(); 之后程序立即处理下一行,它试图获取数组的第一个元素。此时,您的线程还没有完成,也没有将对象放入您的数组中。所以 kun[0] 中没有对象。
-
试试这个:@Query("SELECT * FROM kuh_table WHERE name = :kuhName" AND name IS NOT NULL)
-
@Olli 在这种情况下你将如何等待线程完成?
-
@PrajwalWaingankar 遗憾的是这不起作用,我仍然得到一个 nullpointerException
-
您应该能够在不使用其他线程的情况下执行此操作。如果 DAO 操作花费太多时间以至于它会冻结 gui,您应该阅读developer.android.com/reference/android/os/AsyncTask 这将为您提供一个覆盖将在后台执行的函数(从 DAO 获取结果)和一个覆盖哪个函数后台线程完成后将在 gui 线程上执行(在 gui 中处理您的 DAO 结果)。只是在你的 getKuh 函数中等待,直到 DAO 操作完成,这与我认为没有线程的情况下是一样的。
标签: android android-layout android-room viewmodel dao