iPhone - сбой основных данных - PullRequest
0 голосов
/ 25 октября 2011

У меня есть две сущности: продукты и пакеты.У каждого есть свой класс.Продукт может быть в нескольких пачках.

Объекты определены следующим образом:

PRODUCTS
name, string
number, integer 16
fromBundle = to-many relationship to product

BUNDLE
name, string
number, integer 16
product = to-many relationship to fromBundle

Продукты были назначены для связывания следующим образом:

// suppose bundle 1 is composed of products 1, 2, 3 and 4.
NSArray *myProd = [NSArray arrayWithObjects:
    [NSNumber numberWithInt:1],
    [NSNumber numberWithInt:2],
    [NSNumber numberWithInt:3],
    [NSNumber numberWithInt:4],
    nil];

int bundleNumber = 1;
NSString *bundleName = @"My Bundle";
Bundle *aBundle = nil;

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];

request.entity = [NSEntityDescription entityForName:@"Bundle" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat: @"(number == %d)", bundleNumber];
NSError *error = nil;
aBundle = [[context executeFetchRequest:request error:&error] lastObject];

// as the bundle does not exist, this will run
if (!error && !aBundle) {
    aBundle = [NSEntityDescription insertNewObjectForEntityForName:@"Bundle" inManagedObjectContext:context];
    aBundle.string = bundleName;
    aBundle.Number = [NSNumber numberWithInt:bundleNumber];

    for (NSNumber *umNum in myProd) {

            // the product with number = aNum is retrieved... yes it is valid at this point 
            Product *oneProduct = [ProductWithNumber:umNum inManagedObjectContext:context];
            NSMutableSet *mutableSet = [oneProduct mutableSetValueForKey:@"fromBundle"];
            [mutableSet addObject:aBundle];
    }
// Save the context.
NSError *error = nil;
if (![context save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

// everything is fine at this point.

Теперь я хочу получить список всех принадлежащих продуктовк определенному пакету ...

Для этого я использую этот метод в классе Bundle

+ (NSArray *)ProductsInBundle:(Bundle*)aBundle inManagedObjectContext:(NSManagedObjectContext *)context
{
    NSArray *all = nil;


    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    request.entity = [NSEntityDescription entityForName:@"Products" inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:@"(fromBundle == %@)", aBundle];

    NSError *error = nil;
    all = [context executeFetchRequest:request error:&error]; // crashes here

    return all;
}

он падает на назначенной строке последнего метода с сообщением «to-многие ключи здесь не разрешены ", когда я пытаюсь сделать это

NSArray *allProductsInBundle = [Bundle ProductsInBundle:aBundle inManagedObjectContext:self.managedObjectContext];

aBundle действителен в этот момент.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Я думаю, что ваш предикат неверен.У вас нет свойства пакета, но есть свойство fromBundle.

Если это действительно fromBundle, то ваш предикат должен быть:

equest.predicate = [NSPredicate predicateWithFormat:@"(fromBundle == %@)", aBundle];

РЕДАКТИРОВАТЬ:

Есливы пытаетесь выполнить операции со многими отношениями, тогда вам нужно использовать агрегатные функции для предиката.Я думаю, что для вашего случая вам понадобится операция IN.

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215891

1 голос
/ 26 октября 2011

Почему вы делаете выборку, когда у вас есть отношения?Это тяжело и дорого.Просто запросите продукты для пакета через

[aBundle valueForKey:@"product"];

. Извлечение ненужно и приводит к удару диска, когда он вам, вероятно, не нужен.Базовые данные, скорее всего, имеют кэшированные отношения product.

Кроме того, когда вы назначаете продукт для пакета, вам не нужно получать изменяемый набор.Просто установите пакет в продукт через:

[product setValue:bundle forKey:@"fromBundle"];

Базовые данные будут управлять другой стороной отношений.

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