Основные данные, отношение один ко многим - PullRequest
0 голосов
/ 12 февраля 2012

Я новичок в разработке для iOS и провожу некоторые тесты с основными данными.Все было хорошо, пока я не начал играть с отношениями.В контексте:

У меня есть 2 объекта: статья и категория.

Статья состоит из двух элементов: idArticle и text.Статьи должны иметь одну категорию.Категория состоит из двух членов: idCategory и name.Категория может иметь 0 или несколько статей.

Статья:

  • idArticle
  • текст
  • категория (отношение к категории, обратная = статьи, минимумнеобязательно, максимум 1)

Категория:

  • idCategory
  • name
  • статьи (Для многих Отношение к статье, Inverse = категория, минимум необязательно, максимум неограниченно)

Пока я добавляю статью.Я первый сюрприз, что у меня есть не только article1.category, но и article1.idCategory и article1.name!В настоящее время я установил все свои атрибуты, отношения по желанию.Что бы я ни делал, когда я добавляю новую статью, используя приведенный ниже код, она также добавляет новую категорию, которая будет содержать idCategory = 0 и name = nil, если я не установлю article.idCategory и article.name!или к соответствующему значению, если я их установлю.Однако я не хочу, чтобы он создавал эту категорию, я просто хочу добавить существующую категорию.article.category работает отлично;это добавить статью в нужную категорию!Если бы я только установить article.category;article.idCategory will = 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;
    }    
}

Спасибо!Это супер базовое задание в настоящее время разрушает мое воскресенье!

1 Ответ

1 голос
/ 12 февраля 2012

Наиболее вероятный способ, которым это могло бы произойти, - это если ваш объект Article является подклассом категории.

В противном случае вы получите исключения при установке gmtArticle.idCategory, сообщающем, что GasMattersTodayArticles не является ключевымзначения, соответствующие idCategory.

GasMattersTodayArticles и GasMattersTodayCategory, должны быть подклассами NSManagedObject (или, возможно, базовым классом для вашего проекта).

Вы создаете новую категорию, когда создаете статью, потому что согласно вашей структуре Категория является .

Однако, не видя .xcdatamodel, этот ответ является предположением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...