我是iOS开发的新手,并对核心数据进行了一些测试。直到我开始与人交往之前,一切都很好。
在上下文中:

我有2个实体:文章和类别。

文章有两个成员idArticle和text。文章必须具有一个类别。
类别具有两个成员idCategory和名称。类别可以有0或几条。

文章:


idArticle
文本
类别(与类别的关系,逆=文章,最小可选,最大1)


类别:


idCategory
名称
文章(与文章的许多关系,逆=类别,最小可选,最大无限)


当我添加文章时。我首先感到惊讶的是不仅拥有article1.category,而且还有article1.idCategory和article1.name!
我目前已将所有属性(关系)设置为可选。
无论我做什么,当我使用下面的代码添加新文章时,它也会添加一个新类别,如果我不设置article.idCategory和article.name,它将包含idCategory = 0和name = nil!或设置为相应的值。但是,我不希望它创建该类别,我只想添加一个现有的类别。
article.category工作正常;它将文章添加到正确的类别!如果我只设置article.category; article.idCategory = 0,article.name = nil。

我想我可以删除新创建的类别,但我希望代码整洁。我已经在网上搜索了,但没有找到与此问题类似的示例。我在这里不处理任何GUI。
我的代码:

 - (BOOL)createNewGmtArticle:(NSNumber*)articleID title:(NSString*)paramTitle text:(NSString*)paramText date:(NSDate*)paramDate categoryID:(NSNumber*)paramCategoryID categoryName:(NSString*)paramCategoryName

{
    GasMattersTodayArticles *gmtArticle = [NSEntityDescription insertNewObjectForEntityForName:@"GasMattersTodayArticles" inManagedObjectContext:self.managedObjectContext]; // Look the given entitiy GasMattersTodayArticles in the given managed obj context

    if(gmtArticle != nil)
    {
        // Fill article
        gmtArticle.idArticle = articleID;
        gmtArticle.text = paramText;

        gmtArticle.category = [self getGmtCategoryWithId:paramCategoryID];
        //gmtArticle.idCategory = gmtArticle.category.idCategory;
        //gmtArticle.name = gmtArticle.category.name;

        NSError *savingError = nil;
        if([self.managedObjectContext save:&savingError]) // flush all unsaved data of the context to the persistent store
        {
            NSLog(@"Successfully saved the context");
            return YES;
        }
        else
        {
            NSLog(@"Failed to save the context. Error = %@", savingError);
            return NO;
        }
    }

    NSLog(@"Failed to create the new article");
    return NO;
}




-(GasMattersTodayCategory *)getGmtCategoryWithId:(NSNumber*)categoryID

{
    // Create the fetch request first
    NSDictionary *subs = [NSDictionary dictionaryWithObject:categoryID forKey:@"SEARCH_KEY"];
    NSFetchRequest *fetchRequest = [self.managedObjectModel fetchRequestFromTemplateWithName:@"CategoryWithKey" substitutionVariables:subs];
    // Entity whose contents we want to read
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"GasMattersTodayCategory" inManagedObjectContext:self.managedObjectContext];

    // Tell the request that we want to read the content of the person entity
    [fetchRequest setEntity:entity];

    // Excecute the fetch request on the context
    NSError* requestError = nil;
    GasMattersTodayCategory *category = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&requestError] lastObject];

    // Make sur we get a category
    if(category != nil)
    {
        return category;
    }
    else
    {
        NSLog(@"Could not find any Category entities with this Id in the context.");
        return nil;
    }
}


谢谢!这个超级基本任务目前正在破坏我的星期天!

最佳答案

这种情况最有可能发生的方式是,您的商品实体是Category的子类。

否则,如果设置gmtArticle.idCategory告诉您GasMattersTodayArticles不符合idCategory的键值,则会出现异常。

GasMattersTodayArticlesGasMattersTodayCategory都应该是NSManagedObject的子类(或者可能是项目的基类)。

创建文章时,您正在创建一个新类别,因为根据您的结构,文章is-a类别。

但是,在没有看到.xcdatamodel的情况下,这个答案只是一个猜测。

10-08 05:34