iPhone - сохранение основных данных приводит к появлению нескольких одинаковых объектов при запуске приложения - PullRequest
1 голос
/ 12 июня 2011

Хорошо, ребята, я пытаюсь выяснить это, но у меня трудное время. Так что у этого приложения есть синтаксический анализатор XML, который отправляет и захватывает все xmls, анализирует их и сохраняет все данные в Core Data. Это все прекрасно работает. Однако я пытаюсь сохранить базовые данные и вызвать их при следующем запуске, за исключением тех случаев, когда я делаю это, анализатор запускается снова, и те же элементы снова объединяются в uitableview. Я знаю, что это потому, что в applicationDidFinishLaunchingWithOptions я вызываю [parser getAllConferences] каждый раз, когда приложение запускается, однако я не уверен, как его запускать только тогда, когда Core Data пуст. Надеюсь, что вы все можете пролить свет на этот вопрос :) Любые комментарии и предложения приветствуются, если что-то еще нужно, дайте мне знать!

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {


        SHPEXmlParser *parser = [SHPEXmlParser alloc];

        [parser initWithManagedObjectContext:[self managedObjectContext]];

        [parser getAllConferences];
        [parser release];

        [self.viewController initWithContext:[self managedObjectContext]];

        // Override point for customization after application launch.
        self.window.rootViewController = self.viewController;
        [self.window makeKeyAndVisible];
        return YES;
    }

- (void)applicationWillTerminate:(UIApplication *)application
{
    [self saveContext];
}

- (void)saveContext
{
    NSError *error = nil;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Что не так с:

if (NO == [[NSFileManager defaultManager] fileExistsAtPath:@"put your path to sqlite file here"]) {
    //parse stuff and load data into store
}

Или

NSFetchRequest *conferencesRequest = [NSFetchRequest fetchRequestForEntityWithName:@"conferences" inManagedObjectContext:context];
NSArray *conferences = [self.managedObjectContext executeFetchRequest:conferencesRequest];
if (conferences.count == 0) {
       //parse stuff and load data into store
}

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

0 голосов
/ 12 июня 2011

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

...