2016-07-27 11 views
0

Wie bekomme ich die letzten/ersten n Ergebnisse von RLMResults?Realm get last n Ergebnisse

Ich denke, Sie können zu NSArray umwandeln und dann - (NSArray *)subarrayWithRange:(NSRange)range; tun, aber das ist ein schlechter Weg, wenn RLMResults viel zählen.

Auch können Sie so etwas wie:

self.arrayOfSubscriptedResults = [NSMutableArray new]; 
RLMResults *results = [[ModelRO objectsWhere:@"smth == 21"] sortedResultsUsingProperty:@"property" ascending:NO]; 
[self.arrayOfSubscriptedResults addObject: [results lastObject]]; 
[self.arrayOfSubscriptedResults addObject: [results objectAtIndex:(results.count - 1)]]; 
[self.arrayOfSubscriptedResults addObject: [results objectAtIndex:(results.count - 2)]]; 

aber dies wie eine Krücke.

Vielleicht mit Prädikat, aber kann nicht herausfinden, wie?

EDIT:

Endlösung:

RLMResults *results = getRealmResultsHere; 

int count = results.count; 
int numberOfFirstObjects = 3; 

if (count > 0) 
{ 
    self.mutableArray = [NSMutableArray arrayWithCapacity: numberOfFirstObjects]; 

    for (NSUInteger index = 0; (self.mutableArray.count < numberOfFirstObjects) && (count > index); index++) 
    { 
     [self.mutableArray addObject:results[index]]; 
    } 
} 

Antwort

0

Warum nicht in einer Schleife über die RLMResults?

Mit dem folgenden Realm Modell

@interface Dog : RLMObject 
@property NSString *name; 
@property NSInteger age; 
@end 
@implementation Dog 
@end 

und diesem Code:

RLMRealm *realm = [RLMRealm defaultRealm]; 
[realm transactionWithBlock:^{ 
    [Dog createInRealm:realm withValue:@[@"Rex", @1]]; 
    [Dog createInRealm:realm withValue:@[@"Fido", @2]]; 
    [Dog createInRealm:realm withValue:@[@"Einstein", @3]]; 
    [Dog createInRealm:realm withValue:@[@"Ruffles", @4]]; 
}]; 

RLMResults *allDogs = [Dog allObjects]; 
NSUInteger numberOfDogs = 3; 
NSMutableArray *last3Dogs = [NSMutableArray arrayWithCapacity:numberOfDogs]; 
for (NSUInteger index = allDogs.count - numberOfDogs; last3Dogs.count < numberOfDogs; index++) { 
    [last3Dogs addObject:allDogs[index]]; 
} 
NSLog(@"last 3 dogs: %@", last3Dogs); 

Dies würde melden Sie wie folgt vor:

last 3 dogs: (
    "Dog {\n\tname = Fido;\n\tage = 2;\n}", 
    "Dog {\n\tname = Einstein;\n\tage = 3;\n}", 
    "Dog {\n\tname = Ruffles;\n\tage = 4;\n}" 
) 
+0

ich so tat, fast. Aber in Ihrem Beispiel - was, wenn 'RLMResults * allDogs' weniger als 3 Objekte enthält? –

+0

das hängt von Ihrer Situation ab. Willst du behaupten? oder geben Sie "höchstens" die Anzahl der gewünschten Artikel an. ganz bei dir – jpsim