Как я могу выполнить циклическую загрузку данных из нескольких объектов в Базовых данных с наименьшим количеством кода? - PullRequest
1 голос
/ 06 февраля 2011

Я пытаюсь сделать загрузку нескольких объектов более управляемой в коде.Приведенный ниже код прикреплен к объекту, который может загружаться более 1000 раз, поэтому я поместил его в цикл и прикрепил управляемый массив объектов.

Проблема в том, что я понятия не имею, является ли ключдоступно в singleObject, я получаю сбой на [singleObject valueForKey: @ "actor"], когда я нахожусь в директории.Это потому, что ключ "актер" не существует.См. Мой код здесь.

NSArray *entities = [[NSArray alloc] initWithObjects: @"actors", @"directors", @"subtitles", @"audios", nil];

for (NSString *anEntity in entities)
{
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:anEntity inManagedObjectContext:context];
    [request setEntity:entityDescription];
    NSArray *objects = [context executeFetchRequest:request error:&error];
    if (objects == nil) {
        // error
    }

    for (NSManagedObject *singleObject in objects)
    {
        if (singleObject != nil) 
        {
            if ([singleObject valueForKey:@"actor"] != nil)
            {
                [self.actors addObject:[singleObject valueForKey:@"actor"]];
            }
            else if ([singleObject valueForKey:@"director"] != nil)
            {
                [self.directors addObject:[singleObject valueForKey:@"director"]];
            }
            else if ([singleObject valueForKey:@"subtitle"] != nil)
            {
                [self.subtitles addObject:[singleObject valueForKey:@"subtitle"]];
            }
            else if ([singleObject valueForKey:@"audio"] != nil)
            {
                [self.audios addObject:[singleObject valueForKey:@"audio"]];
            }
        }
    }
}

[entities release];
[request release];'

Как я могу заставить этот код работать и быть значительно расширяемым, не прибегая к куче попыток / лови вокруг всего?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

ОК. Я думаю, что нашел способ, который работает для меня, используя вместо этого NSDictionary.Это работает в моей ситуации просто потому, что мои имена сущностей множественного числа (актеры), а мои атрибуты - единственного числа (актер).Вот что я придумал:

NSMutableDictionary *entities = [[NSMutableDictionary alloc] init];
[entities setValue:actors forKey:@"actors"];
[entities setValue:directors forKey:@"directors"];
[entities setValue:subtitles forKey:@"subtitles"];
[entities setValue:audios forKey:@"audios"];

for (NSMutableString *aKey in entities)
{
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:aKey inManagedObjectContext:context];
    [request setEntity:entityDescription];
    NSArray *objects = [context executeFetchRequest:request error:&error];
    if (objects == nil) {
        // error
    }

    for (NSManagedObject *singleObject in objects)
    {
        if (singleObject != nil) 
        {
            if ([singleObject valueForKey:[aKey substringToIndex:[aKey length] - 1]] != nil)
            {
                [[entities valueForKey:aKey] addObject:[singleObject valueForKey:[aKey substringToIndex:[aKey length] - 1]]];
            }
        }
    }
}

Подробности:

Я перебираю ключи в словаре.Я делаю их изменяемыми, чтобы я мог снять с конца ключа.Затем я извлекаю значение (которое является массивом) из этого ключа и загружаю массив, используя ключ без s.

Несколько сложнее для чтения кода, но в действительности снижается управляемостьТеперь все, что мне нужно сделать, это добавить новую множественную сущность с соответствующим сингулярным атрибутом и просто добавить пару ключ / значение в словарь.

0 голосов
/ 08 февраля 2011

Я не знаю, поможет ли это вам или нет, потому что я не на 100% уверен в том, что вы пытаетесь сделать, но у меня была похожая проблема при импорте данных из базы данных MySQL в CoreData. Я широко использовал NSEntityDescription Методы propertiesByName, attributesByName и relationshipsByName. В моем случае, используя описания полей из таблицы MySQL, я убедился, что атрибуты моей модели совпадают с именами полей, поэтому вместо того, чтобы выполнять целую кучу if/else тестов, у меня просто был тест кода, чтобы проверить, является ли [[SomeEntityDescription attributesByName] valueForKey:someFieldName] вернул что-то кроме нуля. Если это так, я устанавливаю значение для объекта, который я создавал из импортированных данных, используя имя поля в качестве ключа.

Вы можете сделать что-то подобное для ваших отношений. если я понимаю, что вы пытаетесь сделать правильно, сравнив ключи [someEntityDescription relationshipsByName], или вы можете получить все отношения, нацеленные на интересующую вас сущность, используя relationshipsWithDestinationEntity:(NSEntityDescription *)entity.

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