Лучший способ импортировать более 7.000 контактов в CoreData - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь импортировать более 7000 контактов в CoreData через, сейчас я пытаюсь использовать поток, но приложение вылетает

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSLog(@"threadSendToBackground");
for (NSDictionary *contactDetail in [[xmlDictionary valueForKey:@"response"] valueForKey:@"entry"]) {

    Contacts *AddCDContacts = (Contacts *)[NSEntityDescription insertNewObjectForEntityForName:@"Contacts" inManagedObjectContext:appDelegate.managedObjectContext];

    [AddCDContacts setDisplayName:[contactDetail valueForKey:@"displayName"]];

    NSError *error;
    if (appDelegate.managedObjectContext != nil) {
        if ([appDelegate.managedObjectContext hasChanges] && ![appDelegate.managedObjectContext save:&error]) {
            // Handle the error.
            NSLog(@"Error saving");
        } 
    }        
}

[pool release];  

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Читали ли вы статью о базовых данных ( Эффективный импорт данных ), которая занимается этим?Он предоставит вам множество советов, которые могут оказаться полезными в этом отношении.

0 голосов
/ 08 августа 2011

Никогда не следует использовать контекст управляемого объекта более чем в одном потоке. Если вы используете базовые данные в фоновом потоке, вы должны создать отдельный NSManagedObjectContext для этого потока.

Обязательно прочитайте главу Базовые данные и параллелизм в Руководстве по программированию базовых данных, в противном случае вы сами застрелитесь.

0 голосов
/ 08 августа 2011

Не сохраняйте контекст в цикле for, просто сохраните его один раз в конце. Кроме того, особенно на устройствах с ограниченной памятью, попробуйте повторно использовать объекты вместо постоянного назначения новых.

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