0

我正在尝试使用其属性对 RLMArray 进行排序,但出现错误:

此方法只能在从 RLMRealm 检索到的 RLMArray 实例上调用

 RLMResults *rlmResults  =  [myLog.myRLMArray sortedResultsUsingProperty:@"orderNum" ascending:YES];

myLog.myRLMArray是我从RLMRealm.

myLog声明为:

 RLM_ARRAY_TYPE(MyWidgetSet)
@interface MYLogObject : RLMObject
@property RLMArray< MyWidgetSet *>< MyWidgetSet > *myRLMArray;
@end

我的自定义课程是

#import <Realm/Realm.h>

@interface MyWidgetSet : RLMObject
@property NSString *widgetName;
@property NSString *orderNum;
@end

我发现了一个2 年前发布的类似问题。我希望有一个更新的解决方案来解决这个问题。我正在使用 Realm 2.1.2

4

2 回答 2

2

正如您在错误消息中看到的,该sortedResultsUsingProperty方法只能用于通过查询获得的对象。您应该先将对象保存到 Realm。这是对表演进行排序的最佳方式RLMArray

或者,如果您想对RLMArray尚未保存到 Realm 的文件进行排序,您可以使用NSArray. 所以你的做法是正确的。唯一的事情是转换RLMArrayNSArray可以写得更简单。只需使用valueForKey:@"self",您不需要迭代所有元素。

NSArray *tempLog = [myLog.myRLMArray valueForKey:@"self"];
...
于 2016-12-29T17:54:04.880 回答
1

现在我正在使用 NSArray 对数据进行排序。我希望有人会想出一个更好的方法来直接使用 RLMArray

NSMutableArray *tempLog = [NSMutableArray array];
for (MyWidgetSet *tempSet in myLog.myRLMArray){
    [tempLog addObject:tempSet];
}

并使用排序sortedArrayUsingComparator

 NSArray *tempWelLogCopy = [tempLog sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {

        if ([[obj1 valueForKey:@"orderNum"] integerValue] > [[obj2 valueForKey:@"orderNum"] integerValue]) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        if ([[obj1 valueForKey:@"orderNum"] integerValue] < [[obj2 valueForKey:@"orderNum"] integerValue]) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];

并将排序后的数据添加回 RLMArray

    [myLog.myRLMArray removeAllObjects];
    [myLog.myRLMArray addObjects:tempWelLogCopy];
于 2016-12-28T18:33:39.877 回答