Pregunta

Necesito tu ayuda con algo, ya que no puedo entender esto.Estoy usando Manto junto con CoreData en iOS.

Tengo relaciones definidas que se ven de la siguiente manera:

Publicación 1:N Comentario

Cuando extraigo los datos de mi servicio REST, creo una publicación de objeto Mantle que contiene un NSMutableArray de comentarios.Esto funciona perfectamente.

Luego lo guardo en Core Data y aquí es donde no sé si estoy haciendo las cosas bien.

[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error];

Entonces estoy haciendo esto para almacenar mi objeto de publicación en Core Data.El modelo de datos central tiene una relación llamada "post_has_comments", que es una relación en cascada de uno a muchos.Entonces, en el objeto Publicar tengo "posts_has_comments" -> en cascada, en mi objeto "Comentar" tengo una relación uno a uno con "Nullify".

Afaik, Core Data trata esto como un NSSet.Sin embargo, lo que estoy tratando de poner es un NSMutableArray, ya que Mantle se encargará de esto (al menos eso es lo que me dijo un vistazo rápido a su fuente).

Desafortunadamente, cuando recupero el objeto de Core Data con

Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil];

Los comentarios de propiedad en el objeto de publicación son un NSSet vacío y obtengo bastantes errores al insertar el elemento de antemano.Los errores que recibo:

Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...]

Estoy atascado. ¿Quizás me estoy perdiendo algo importante aquí?

My Post Class implementa los siguientes métodos estáticos:

+ (NSDictionary *)managedObjectKeysByPropertyKey {
return @{
         @"post_id" : @"id",
         @"comments" : @"post_has_comments"
         };
}

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
             @"post_id" : @"id",
             };
}

+ (NSDictionary *)relationshipModelClassesByPropertyKey {
    return @{
             @"comments" : IHComment.class
             };
}
¿Fue útil?

Solución

de la documentación del manto:

Mantle facilita la escritura de una capa de modelo simple para su aplicación de cacao o cacao.

Esta es simplemente una declaración no probada.Mirando el marco, no veo dónde está la evidencia.Debe obtener sus objetos e insertarlos en datos principales usando las API de 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;
}

Eso es todo lo que hay.

Otros consejos

Una solución sencilla es escribir su propio método de establecimiento de propiedades y, si el valor que se establece es NSSet luego convertirlo a NSMutableArray antes de devolverlo a su propiedad ivar.

Por ejemplo:

- (void)setComments:(NSMutableArray *)comments {
    if ([comments isKindOfClass:NSSet.class]) {
        _comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]];
    } else {
        _comments = comments;
    }
}

¡Lo he hecho yo mismo varias veces y funciona de maravilla!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top