App在App Store上启动时崩溃 - 在设备上完美运行

时间:2015-03-03 03:50:06

标签: ios objective-c iphone sqlite

我有一个应用程序在应用程序商店评论启动时崩溃,但在设备和模拟器上运行完美。以下是具体细节。

该应用程序是为IOS 7编写的,目前正在IOS 8.x上进行测试。我象征着Apple的崩溃日志,并且在第一次尝试访问预先填充的Core Data sqlite db中存储的信息时崩溃了。

此代码在启动时执行db copy:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory]     URLByAppendingPathComponent:@"CC.sqlite"];
    NSArray *paths =     NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *storePath = [documentsDirectory     stringByAppendingPathComponent: @"CC.sqlite"];

    // Check if the sqlite store exists
    if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) {
        NSLog(@"sqlite db not found... copy into place");

        // copy the sqlite files to the store location.
        NSString *bundleStore = [[NSBundle mainBundle]    pathForResource:@"CC" ofType:@"sqlite"];
         [[NSFileManager defaultManager] copyItemAtPath:bundleStore     toPath:storePath error:nil];

    }
    else {
        NSLog(@"Already exists");
    }
    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator     alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSDictionary *options = @{ NSSQLitePragmasOption :     @{@"journal_mode" : @"DELETE"} };


    if (![__persistentStoreCoordinator     addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL     options:options error:&error])
    {
                NSLog(@"error %@, %@", error, [error userInfo]);

    }

    return __persistentStoreCoordinator;
}

我们已经在各种IOS设备(由几个不同的人)上运行了几百次而没有任何问题,但总是在苹果公司遇到启动崩溃。

从崩溃日志中可以清楚地看到应用程序(在应用程序商店评论期间)试图通过Core Data访问不存在的sqlite数据库,但我不知道为什么这只发生在Apple,以及为什么我无法重现错误。我不确定要添加到问题中的其他信息,但会根据需要愉快地更新。

感激地收到任何建议......

1 个答案:

答案 0 :(得分:0)

我将在这里回答我自己的问题,虽然我在尝试解决问题时所做的代码更改使得发布代码不是很有帮助。

我必须将启动数据库操作放在完成块中。这包括将所有内容移动到我的初始启动视图控制器中,并在初始化数据库时禁用我的标签栏按钮。

发生了什么事情是Core Data sqlite数据库中的某些项目在完全预加载之前是必需的,因此崩溃了。

有关块的更多内容可以找到here