Ошибка CoreData / RegEx: невозможно создать выражение регулярного выражения из объекта - PullRequest
1 голос
/ 14 февраля 2012

Кажется, я получаю ошибку, которую не могу понять. Надеюсь, это не будет слишком запутанным и длинным, но так как я не могу найти какие-либо ответы в своих поисках, я думаю, что это может быть необходимо. В моей программе есть несколько объектов:

ItemSold Счет-фактура Клиент

Customer может иметь много Invoices, Invoices может иметь много ItemSolds.

В моем Интерфейсном Разработчике у меня есть три таблицы. Одна таблица представляет клиентов, другая представляет счета-фактуры, а последняя представляет товары, проданные в этом счете-фактуре. Поэтому, когда вы выбираете клиента, его счета отображаются в таблице счетов. После того, как вы щелкнете по счету, элементы этого счета отображаются в последней таблице.

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

if (managedObjectContext == nil) 
{ 
    managedObjectContext = [(HistoryController *)[[NSApplication sharedApplication] delegate] managedObjectContext]; 
}
NSError *error = nil;

// fetch all customers
NSFetchRequest *fetchRequest2 = [[NSFetchRequest alloc] init];
NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Customer"
                                           inManagedObjectContext:managedObjectContext];
[fetchRequest2 setEntity:entity2];
fetchedCustomers = [managedObjectContext executeFetchRequest:fetchRequest2 error:&error];
if (fetchedCustomers == nil) {
    NSLog(@"ERROR");
}
[fetchRequest2 release];
// end of customer fetch

// fetch all invoices
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Invoice"
                                          inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSLog(@"A");
if ([customerTable selectedRow] >= 0)
{
    NSLog(@"B");

    int index = (int)[customerTable selectedRow];

    NSLog(@"%@", index);
    NSString *customerString = [[fetchedCustomers objectAtIndex:(index)] valueForKey:@"CustomerNumber"];
    NSNumber *customerNumber = [NSNumber numberWithInt:([customerString intValue])];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"customer.CustomerNumber like %@", customerNumber];
    [fetchRequest setPredicate:predicate];
}

fetchedInvoices = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedInvoices == nil) {
    NSLog(@"ERROR");
}
[fetchRequest release];
// end of invoice fetch

// fetch specific invoice
NSFetchRequest *fetchRequest3 = [[NSFetchRequest alloc] init];
NSEntityDescription *entity3 = [NSEntityDescription entityForName:@"ItemSold"
                                           inManagedObjectContext:managedObjectContext];
[fetchRequest3 setEntity:entity3];

if ([invoicesListTable selectedRow] >= 0)
{

    NSLog(@"C");
    int index = (int)[invoicesListTable selectedRow];

    NSLog(@"%i", (int)[invoicesListTable selectedRow]);
    NSLog(@"%i", index);
    NSString *invoiceString = [[fetchedInvoices objectAtIndex:(index)] 
                                valueForKey:@"InvoiceNumber"];
    NSNumber *invoiceNumber = [NSNumber numberWithInt:([invoiceString intValue])];
    NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"invoice.InvoiceNumber like %@", invoiceNumber];
    [fetchRequest3 setPredicate:predicate3];
}

NSLog(@"D");

fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest3 error:&error];
if (fetchedObjects == nil)
{
    NSLog(@"ERROR");
}
[fetchRequest3 release];

[invoiceTable reloadData];
NSLog(@"D2");

}

Если я выполню и нажму на строку, вот что я получу:

2012-02-13 16:42:35.326 InventoryProgram[7056:707] A

2012-02-13 16:42:35.327 InventoryProgram[7056:707] C

2012-02-13 16:42:35.327 InventoryProgram[7056:707] 0

2012-02-13 16:42:35.328 InventoryProgram[7056:707] 0

2012-02-13 16:42:35.328 InventoryProgram[7056:707] D

2012-02-13 16:42:35.329 InventoryProgram[7056:707] Can't create a regex expression from object 2.

Я показываю вывод букв, чтобы показать, где следует управление. Это следует, когда я выбираю строку, выводит правильный номер строки (0), и фактически делает это мимо того места, где, как я думал, была проблема. Выводя букву D, она проходит область NSPredicate, из-за которой, как я думал, возникла проблема с регулярным выражением. Теперь я предполагаю, что он попадает в executeFetchRequest и сталкивается с проблемой назначенного ему NSPredicate.

У кого-нибудь есть какие-либо идеи / что-либо вообще, чтобы указать мне правильное направление здесь? Я не могу понять, в чем проблема. Я действительно надеюсь, что здесь не было слишком много кода, я просто пытаюсь дать всю информацию, которую могу.

1 Ответ

8 голосов
/ 17 февраля 2012

Заменить:

NSString *invoiceString = [[fetchedInvoices objectAtIndex:(index)] 
                            valueForKey:@"InvoiceNumber"];
NSNumber *invoiceNumber = [NSNumber numberWithInt:([invoiceString intValue])];
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"invoice.InvoiceNumber like %@", invoiceNumber];

На:

NSString *invoiceString = [[fetchedInvoices objectAtIndex:(index)] 
                                valueForKey:@"InvoiceNumber"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"invoice.InvoiceNumber = %@", invoiceString];

Решает проблему.

...