Ich arbeite an einer App, wo ich eine Remote-Suche zu einem Server machen möchte. Ich möchte, dass RestKit die abgerufenen Daten in der Datenbank speichert. Ich führe zuerst eine lokale Suche durch (die zurzeit funktioniert), dann möchte ich die Fernsuche machen und dann eine Tabellenansicht mit den neuen Ergebnissen aktualisieren.iOS, Remote-Server-Suche mit RestKit
Ich habe zwei Probleme, 1. wie soll meine Zuordnung aussehen und 2. der JSON gibt ein Array mit zwei verschiedenen Arten von Objekten zurück.
Die URL sieht wie folgt aus:
search.json?search=[search string]
Die JSON es sieht wie folgt zurückgibt:
[
{
"event": {
"id": 2,
[...]
},
{
"news": {
"id": 16,
[...]
}
Wo Ereignis und Nachrichten sind zwei Arten von Objekten.
In meiner App habe ich drei Modelle, Post (abstrakte Entität und Superklasse) NewsPost (Unterklasse zu Post) und Event (Unterklasse zu Post).
sieht meine Zuordnungen wie folgt aus:
RKManagedObjectMapping* newsMapping = [RKManagedObjectMapping mappingForClass:[NewsPost class] inManagedObjectStore:objectManager.objectStore];
newsMapping.primaryKeyAttribute = @"newsId";
newsMapping.rootKeyPath = @"news";
[newsMapping mapKeyPath:@"id" toAttribute:@"newsId"];
RKManagedObjectMapping *eventMapping = [RKManagedObjectMapping mappingForClass:[CalendarEvent class] inManagedObjectStore:objectManager.objectStore];
eventMapping.primaryKeyAttribute = @"calendarId";
eventMapping.rootKeyPath = @"calendars";
[eventMapping mapKeyPath:@"id" toAttribute:@"calendarId"];
// These two works.
[objectManager.mappingProvider setObjectMapping:newsMapping forResourcePathPattern:@"/package_components/1/news"];
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:@"/package_components/1/calendars"];
// I don't know how these should look/work.
// Since the search word can change
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:@"/package_components/1/search\\.json?search="];
[objectManager.mappingProvider setObjectMapping:newsMapping forResourcePathPattern:@"/package_components/1/search\\.json?search="];
Meine Suche Code wie folgt (lokale Suche works) aussieht:
- (void)setUpSearch
{
if (self.searchField.text != nil) {
[self.posts removeAllObjects];
[self.events removeAllObjects];
[self.news removeAllObjects];
// Search predicates.
// Performs local search.
NSPredicate *contactNamePredicate = [NSPredicate predicateWithFormat:@"contactName contains[cd] %@", self.searchField.text];
NSPredicate *contactDepartmentPredicate = [NSPredicate predicateWithFormat:@"contactDepartment contains[cd] %@", self.searchField.text];
[...]
NSArray *predicatesArray = [NSArray arrayWithObjects:contactNamePredicate, contactDepartmentPredicate, contactEmailPredicate, contactPhonePredicate, linkPredicate, titlePredicate, nil];
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicatesArray];
self.posts = [[Post findAllWithPredicate:predicate] mutableCopy];
if (self.posts.count != 0) {
self.noResultsLabel.hidden = YES;
for (int i = 0; i < self.posts.count; i++) {
Post * post = [self.posts objectAtIndex:i];
if (post.calendarEvent == YES) {
[self.events addObject:post];
} else {
[self.news addObject:post];
}
}
}
// reload the table view
[self.tableView reloadData];
[self performRemoteSearch];
}
}
- (void)search
{
[self setUpSearch];
[self hideKeyboard];
[self performRemoteSearch];
}
- (void)performRemoteSearch
{
// Should load the objects from JSON
// Note that the searchPath can vary depending on search text.
NSString *searchPath = [NSString stringWithFormat:@"/package_components/1/search.json?search=%@", self.searchField.text];
RKObjectManager *objectManager = [RKObjectManager sharedManager];
[objectManager loadObjectsAtResourcePath:searchPath delegate:self];
}
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects
{
// This never gets called.
// Should update my arrays and then update the tableview, but it never gets called.
// Instead I get Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "Could not find an object mapping for keyPath: ''
}
Irgendwelche Tipps, wie ich sollte oder tun würde sehr geschätzt werden könnte.
Hallo, Ich denke, diese Frage zu versuchen. 1. Können Sie das Format von JSON in irgendeiner Weise ändern? Ich möchte wissen, ob Sie zu jedem der Ergebnisse einen Root-Key-Pfad hinzufügen können (das wird es erheblich vereinfachen). 2. Sie verwenden NSManagedObject für Nachrichten und Ereignisse. Möchten Sie das Mapping bei der Benutzersuche in Coredata speichern? –
Hallo, ja, wenn nötig kann ich den JSON ändern. Und ja, ich möchte die Ergebnisse lokal zwischenspeichern und speichern, wenn die Benutzer suchen. – Anders
Lassen Sie mich wissen, ob die Antwort für Sie funktioniert. –