2011-05-04 11 views
5

Tengo dos entidades de datos centrales, Articles y Favorite. Articles tiene una relación To-Many a Favorite. Primero, inserté todo el objeto Articles con éxito.Cómo insertar un registro de datos centrales relacionado con otro sin duplicación

Ahora, estoy tratando de insertar ArticleID en la entidad "Favorito" pero no puedo. O el registro se inserta con una relación vacía o se inserta con un nuevo registro en la entidad "Artículos".

Creo que debería obtener el registro relacionado en la entidad Articles primero y luego usarlo para insertar en Favorite pero no estoy seguro de cómo hacerlo. Mi código actual:

NSManagedObjectContext *context =[appDelegate managedObjectContext] ; 
favorite *Fav =[NSEntityDescription insertNewObjectForEntityForName:@"favorite" inManagedObjectContext:context]; 
Articles * Article = [NSEntityDescription insertNewObjectForEntityForName:@"Articles" inManagedObjectContext:context]; 

NSError *error; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Articles" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 
NSPredicate *secondpredicate = [NSPredicate predicateWithFormat:@"qid = %@",appDelegate.GlobalQID ]; 
NSPredicate *thirdpredicate = [NSPredicate predicateWithFormat:@"LangID=%@",appDelegate.LangID]; 
NSPredicate *comboPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: secondpredicate,thirdpredicate, nil]]; 
[fetchRequest setPredicate:comboPredicate]; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 
for (NSManagedObject *info in fetchedObjects) { 
     // ????????????????????????? 

    } 

} 

Cualquier sugerencia sería apreciada.

Respuesta

0

Lo resuelto mediante la creación de nuevo objeto de artículo:

Articles *NewObj = [fetchedObjects objectAtIndex:0]; 

y utilizarlo para insertar relación:

[Fav setFavArticles:NewObj]; 
    [NewObj setArticlesFav:Fav]; 

muchas gracias .. TechZen

4

Primero, asegúrese de tener un recíproco, es decir, una relación bidireccional entre Article y Favorite. Algo como esto:

Article{ 
    favorites<-->>Favorite.article 
} 

Favorite{ 
    article<<-->Article.favorites 
} 

Definir relaciones recíprocas en la base de datos significa que el establecimiento de la relación de un lado establece automáticamente para el otro.

Por lo tanto, para establecer un nuevo Favorite objeto para un Article objeto recién creado lo haría simplemente:

Favorite *fav =[NSEntityDescription insertNewObjectForEntityForName:@"favorite" inManagedObjectContext:context]; 
Articles *article = [NSEntityDescription insertNewObjectForEntityForName:@"Articles" inManagedObjectContext:context]; 
[article.addFavoriteObject:fav]; 
//... or if you don't use custom NSManagedObject subclasses 
[[article mutableSetValueForKey:@"favorites"] addObject:fav]; 

Si bien el objeto Article o el objeto Favorite ya existen, que se vendería el objeto primero, pero el establecimiento de la relación funcionaría exactamente de la misma manera.

La clave es asegurarse de que tiene la relación recíproca para que el contexto del objeto gestionado sepa establecer la relación en ambos objetos.

+0

Gracias TechZen .. Tengo relación ya inversa entre los artículos y el favorito. el objeto de los artículos se inserta previamente y ahora quiero insertar el objeto favorito relacionado. He agregado esta línea en el bucle: [[Fatwa mutableSetValueForKey: @ "FavArticle"] addObject: Fav]; y obtiene este error: Terminación de aplicación debido a excepción no detectada 'NSUnknownKeyException', razón: '[ valueForUndefinedKey:]:. La entidad artículo no es valor de la clave de codificación compatible con la tecla 'FavFArticle'' cómo usar el objeto Artículos recuperados para insertar el objeto favorito ?? .. – smaiibnauf

+0

El error significa que no tiene un atributo llamado/escrito "FavArticle" definido para la entidad/clase 'Artículos'. Esto suele ser el resultado de un error tipográfico que hace que escriba mal el nombre de la tecla, p. el nombre real es algo así como "favArticle" o "favArticles". – TechZen

+0

¿Por qué la relación de Artículo a Favorito es 1> N? –

Cuestiones relacionadas