删除 RealmResult 副本时出现 UnsupportedOperationException

UnsupportedOperationException when deleting copy of RealmResult

没有 fromto 方法从 Realm 中的数据库 select 数据,当我尝试使用 between() 时,我在结果结束,所以我想在将其副本复制到新 listObject.

后将其删除

但即使在另一个列表对象中复制它之后,我也无法删除 realmResult 中的最后一项。

RealmResults<CalendarDto> currentMonthDTOList = Realm.getDefaultInstance().where(CalendarDto.class).between("primaryDayId", startingDayPrimaryKey, endingDayPrimaryKey).findAll().sort("primaryDayId", Sort.ASCENDING);
List<CalendarDto> currentList = currentMonthDTOList;
currentList.remove(currentList.size());

但我收到错误提示 unsupportedOperationException。

我的日志猫长这样

 FATAL EXCEPTION: main
    Process: com.toyanathpatro.gurkha, PID: 17714
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.toyanathpatro.gurkha/com.toyanathpatro.gurkha.activities.DashBoardActivity}: java.lang.ClassCastException: io.realm.RealmResults cannot be cast to java.util.ArrayList
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.ClassCastException: io.realm.RealmResults cannot be cast to java.util.ArrayList
    at com.toyanathpatro.gurkha.fragments.GridCalendarFragment.fetchData(GridCalendarFragment.java:84)
    at com.toyanathpatro.gurkha.fragments.GridCalendarFragment.onCreateView(GridCalendarFragment.java:42)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252)
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:742)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617)
    at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:339)
    at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:601)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237)
    at android.app.Activity.performStart(Activity.java:6253)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

你不能做 List<CalendarDto> currentList = currentMonthDTOList; 因为 currentMonthDTOListRealmResults<CalendarDto> 而不是 List<CalendarDto>

如果要删除最后一个对象,您可以执行 (documentation):

currentMonthDTOList.deleteLastFromRealm();

由于您不想从数据库中删除对象,您可以将结果复制到 List 中并对其进行操作:

List<CalendarDto> dtos = new ArrayList<>();
dtos.addAll(currentMonthDTOList);
dtos.remove(dtos.size());

您可以尝试通过以下方式复制到 RealmList,而不是尝试复制到 List

RealmList <CalendarDto> currentList = new RealmList<CalendarDto>();
currentList.addAll(yourRealmResults.subList(0, yourRealmResults.size()));

虽然我已经看到这对人们有用,但我必须在这里引用 Realm.io news

Work-in-progress

While we are shipping initial support for RxJava now, we still lack Observable support for RealmQuery and RealmList. These will be added in a future update.

此外,您可以尝试新的 copyFromRealm() method and update the DB using copyToRealmOrUpdate() 方法。

您应该构建一个查询来排除不需要的,而不是稍后将其删除。

试试这个:

RealmResults<CalendarDto> results = Realm.getDefaultInstance().where(CalendarDto.class)
    .greaterThanOrEqualTo("primaryDayId", startingDayPrimaryKey)
    .lessThan("primaryDayId", endingDayPrimaryKey)
    .findAll().sort("primaryDayId", Sort.ASCENDING);