Objective c 在iOS7中实现应用图标徽章后台提取时核心数据表被删除

Objective c 在iOS7中实现应用图标徽章后台提取时核心数据表被删除,objective-c,iphone,core-data,ios7,Objective C,Iphone,Core Data,Ios7,我正在尝试在我的AppDelegate.m中实现一个后台抓取,通过RestKit(此处未显示)从web服务中提取最新记录计数,从而获取应用图标徽章以反映更新的记录计数。当我在Xcode中模拟BackGroundFetch时,一切正常。当后台抓取在我的iPhone 5S上运行时,我的整个表TicketList将被删除,没有任何数据。这是代码。有没有人经历过类似的事情,有没有人能就我做错了什么提供一些建议?我已经进行了ReskKit查找,以简化代码并进行调试,以查看它是否会产生任何影响。我看了其他帖

我正在尝试在我的AppDelegate.m中实现一个后台抓取,通过RestKit(此处未显示)从web服务中提取最新记录计数,从而获取应用图标徽章以反映更新的记录计数。当我在Xcode中模拟BackGroundFetch时,一切正常。当后台抓取在我的iPhone 5S上运行时,我的整个表TicketList将被删除,没有任何数据。这是代码。有没有人经历过类似的事情,有没有人能就我做错了什么提供一些建议?我已经进行了ReskKit查找,以简化代码并进行调试,以查看它是否会产生任何影响。我看了其他帖子,还没有找到一个关于为什么会发生这种情况的答案

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    //Added this code for the app icon badge functionality
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    return YES;
}

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)   (UIBackgroundFetchResult))completionHandler
{
    [UIApplication sharedApplication].applicationIconBadgeNumber = 1;
    completionHandler(UIBackgroundFetchResultNewData);
}

*/
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    intAvailCount = 0;
    [self setUpCoreDataStack];
    NSManagedObjectContext *context = [self managedObjectContext];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"TicketList" inManagedObjectContext:context];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];

    self.ticketListData = [[context executeFetchRequest:fetchRequest error:&error] mutableCopy];

    if ([ticketListData count] != 0){
        //Perform loop through TicketList SQLite DB and count using intAvailCount
        TicketList *info = [ticketListData objectAtIndex:0];

        for (info in ticketListData) {
            //Check to see if tickets in table have been added to do
            intAvailCount++;
        }
        //End Loop
    }
    [UIApplication sharedApplication].applicationIconBadgeNumber = intAvailCount;
    completionHandler(UIBackgroundFetchResultNewData);
}

-(void)setUpCoreDataStack
{
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"TicketList.sqlite"];

    NSDictionary *options = @{NSPersistentStoreFileProtectionKey: NSFileProtectionComplete,
                              NSMigratePersistentStoresAutomaticallyOption:@YES};

    NSError *error = nil;
    NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error];
    if (!store)
    {
        NSLog(@"Error adding persistent store. Error %@",error);

        NSError *deleteError = nil;
        if ([[NSFileManager defaultManager] removeItemAtURL:url error:&deleteError])
        {
            error = nil;
            store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:&error];
        }

        if (!store)
        {
            // Also inform the user...
            NSLog(@"Failed to create persistent store. Error %@. Delete error %@",error,deleteError);
            abort();
        }
    }
    self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.managedObjectContext.persistentStoreCoordinator = psc;
}

问题解决了。我将对setUpCoreDataStack的调用移动到示例中的第1个方法didFinishLaunchingWithOptions,该方法在应用程序启动时被调用,我的问题得到了解决。不太清楚为什么会发生这种事,但是,我认为这与每次触发执行后台提取方法时调用setUpCoreDataStack有关。

尝试使用–countForFetchRequest:error:获取票证列表对象的计数,而不是使用for循环进行计数。感谢您的建议,但是,它仍然不能解决我的桌子被毁的问题。