android - 领域仅在重新打开应用程序后才创建插入的对象
问题描述
基本上我试图在尝试使用它之前检查一个对象是否存在,如果不存在,我会预先添加它然后尝试使用它。
如果它不存在,它会被正确添加,但之后应用程序仍然找不到它,除非我重新打开应用程序
一切都按预期工作,但是,如果对象一开始就在那里
private class ExerciseViewPageAdapter extends FragmentPagerAdapter {
Realm realm;
ExerciseViewPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int pos) {
realm = Realm.getDefaultInstance();
String exercise_name = getIntent().getExtras().getString("exercise_name");
boolean found_exercise = realm.where(Exercise.class).equalTo("name", exercise_name).findAll().size() > 0;
if (!found_exercise) {
CompositeDisposable disposable = new CompositeDisposable();
ExerciseClient client = new ExerciseClient(getApplicationContext());
disposable.add(client.getExerciseByName(exercise_name)
.subscribeOn(Schedulers.io())
.subscribe(
this::getExercisesSuccess,
this::getExercisesError
)
);
}
final ArrayList<Exercise> exercise = new ArrayList<>();
exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
if (exercise.get(0) != null) {
switch (pos) {
//returning new fragments depending on position
}
}
//if exercise.get(0) doesn't exist at first, even tho I added it afterwards it's still null here unless I reopen the app or let it crash
finish();
realm.close();
return null;
}
private void getExercisesError(Throwable throwable) {
}
private void getExercisesSuccess(Exercise exercise) {
try (Realm r = Realm.getDefaultInstance()) {
r.executeTransaction(realm -> {
realm.insertOrUpdate(exercise);
});
}
}
@Override
public int getCount() {
return 3;
}
}
realm.where()...
编辑:TL;DR:问题在于,只有在重新打开应用程序之后,在它之前插入一个对象之后才能看到该对象
解决方案
您调用了 api,它将在后台运行,因此在 api 调用上编写的代码将执行。所以你的活动会自动关闭。
调用您的 api 成功验证失败
private void getExercisesSuccess(Exercise exercise) {
try (Realm r = Realm.getDefaultInstance()) {
r.beginTransaction();
realm.insertOrUpdate(exercise);
r.commitTransaction();
//checking records are in realm
final ArrayList<Exercise> exercise = new ArrayList<>();
exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
if (exercise.get(0) != null) {
switch (pos) {
//returning new fragments depending on position
}
}
//if exercise.get(0) doesn't exist at first, even tho I added it afterwards it's still null here unless I reopen the app or let it crash
finish();
realm.close();
}catch(Exception e){}
}
并从您的 getItem() 中删除以下行
final ArrayList<Exercise> exercise = new ArrayList<>();
exercise.add(realm.where(Exercise.class).equalTo("name", exercise_name).findFirst());
if (exercise.get(0) != null) {
switch (pos) {
//returning new fragments depending on position
}
}
//if exercise.get(0) doesn't exist at first, even tho I added it afterwards it's still null here unless I reopen the app or let it crash
finish();
realm.close();
推荐阅读
- docker - 如果对韵律进行了一些更改,为什么需要重新启动 jitsi 中的每个服务?
- angular - Angular ssr,服务器第一次不等待api调用?
- javascript - Mongoose updateMany 用于数组数组
- c++ - 如何在类构造函数中初始化匿名结构?
- javascript - 有没有办法在电子中缓存网页以提供离线支持?
- java - 如何检查字符串中存在的任何单词列表?
- c++ - 使用 OPEN SSL 库使用 aes 256 加密文件
- java - 无法打开只读环境
- arrays - Kotlin Android 中的多维数组
- php - Laravel 7 试图获取非对象的属性“域”(查看: