2016-12-28 59 views
0

我想使用它的屬性進行排序的RLMArray但我得到的錯誤:如何使用屬性對RLMArray進行排序?

This method may only be called on RLMArray instances retrieved from an RLMRealm`

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年前發佈了類似的question。我希望爲這個問題提供更新的解決方案。我正在使用Realm 2.1.2

回答

2

由於您可以在錯誤消息中看到,sortedResultsUsingProperty方法只能用於通過查詢獲得的對象。您應該首先將對象保存到領域。這是對RLMArray進行排序的最佳方法。

或者如果您想排序RLMArray尚未保存到領域,您可以使用NSArray。所以你在做什麼是正確的。唯一可以將RLMArray轉換爲NSArray可以寫得更簡單。只需使用valueForKey:@"self",就不需要迭代所有元素。

NSArray *tempLog = [myLog.myRLMArray valueForKey:@"self"]; 
... 
+0

好提示:-valueForKey:@「self」 –

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]; 
相關問題