Usando il mantello con i dati chiave - Nsset e NSarray
-
21-12-2019 - |
Domanda
Ho bisogno del tuo aiuto con qualcosa, perché non riesco a farti prendere la testa. Sto usando mantle insieme a Coredata in ios.
Ho relazioni definite che sembrano segue:
Posta 1: n Commento
Quando tiro i dati dal mio servizio di riposo, creo un post oggetto del mantello che ha un nsmutablearay di commenti in esso. Questo funziona impeccabilmente.
Poi archiviarlo in dati principali, ed è qui che non so se sto facendo le cose giuste.
[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error];
.
Quindi sto facendo questo per memorizzare il mio oggetto post in dati principali. Il modello di dati chiave ha una relazione chiamata "Post_has_Comments" che è una relazione a cascata una-a-molti. Quindi, sulla posta dell'oggetto ho "post_has_comments" -> cascading, sul mio oggetto "commento" Ho una relazione one-to-one con "annullamento".
AFAIK, I dati chiave trattano questo come NSET. Quello che sto cercando di inserire è un nsmutablearray però, poiché il mantello si prenderà cura di questo (almeno questo è quello che un aspetto veloce nella sua fonte mi ha detto).
Sfortunatamente, quando restituisco l'oggetto dai dati chiave con
Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil];
.
I commenti della proprietà sull'oggetto Post sono un NSET vuoto, e ottengo alcuni errori dopo aver inserito la cosa in anticipo. Gli errori che ottengo:
Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...]
.
Sono bloccato - forse mi manca qualcosa di enorme qui?
My Post Class implementa i seguenti metodi statici:
+ (NSDictionary *)managedObjectKeysByPropertyKey {
return @{
@"post_id" : @"id",
@"comments" : @"post_has_comments"
};
}
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"post_id" : @"id",
};
}
+ (NSDictionary *)relationshipModelClassesByPropertyKey {
return @{
@"comments" : IHComment.class
};
}
. Soluzione
Dalla documentazione del mantello:
.Mantle semplifica la scrittura di un semplice livello di modello per il tuo cacao o l'applicazione touch cacao.
Questa è semplicemente un'istruzione non provata.Guardando il framework, non vedo dove si trova l'evidenza.Dovresti ottenere i tuoi oggetti e inserirli in dati principali usando le API di Apple.
Post *cdPost = [NSEntityDescription insertNewObjectForEntityForName:@"Post"
inManagedObjectContext:self.managedObjectContext];
// configure the cdPost object with the data from the web service
for (id commentObject in commentArrayFromPostObject) {
Comment *cdComment =
[NSEntityDescription insertNewObjectForEntityForName:@"Comment"
inManagedObjectContext:self.managedObjectContext];
// configure the cdComment object with the data from the web service
cdComment.post = cdPost;
}
.
Questo è tutto ciò che ce n'è.
Altri suggerimenti
Una semplice soluzione alternativa è quella di scrivere il proprio metodo di proprietà di proprietà e se il valore che è impostato è generatoDicetagCode, quindi convertilo in NSSet
prima di riportarlo alla proprietà NSMutableArray
.
Ad esempio:
- (void)setComments:(NSMutableArray *)comments {
if ([comments isKindOfClass:NSSet.class]) {
_comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]];
} else {
_comments = comments;
}
}
.
L'ho fatto da solo un paio di volte e funziona come un fascino!