coredata 在 xcode 4.3 上不起作用?

Posted

技术标签:

【中文标题】coredata 在 xcode 4.3 上不起作用?【英文标题】:coredata not working on xcode 4.3? 【发布时间】:2012-02-26 10:25:31 【问题描述】:

只是想知道是否有人遇到过这个问题。

我得到了这段代码,它曾经在以前的 xcode 版本中表现出色。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

    if (persistentStoreCoordinator != nil) 
        return persistentStoreCoordinator;
    

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"mydb.sqlite"];
    /*
     Set up the store.
     For the sake of illustration, provide a pre-populated default store.
     */
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) 
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"sqlite"];
        if (defaultStorePath) 
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        
    

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

     [self addSkipBackupAttributeToItemAtURL:storeUrl];

    NSError *error;
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&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.

         Typical reasons for an error here include:
         * The persistent store is not accessible
         * The schema for the persistent store is incompatible with current managed object model
         Check the error message to determine what the actual problem was.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
        

    return persistentStoreCoordinator;

我希望从这里得到以下结果:

    如果我的包中没有“mydb.sqlite”,则从头开始创建一个空的“mydb”。 如果我的主包中存在“mydb.sqlite”,那么我希望它被复制到指定的目录中。 如果“mydb.sqlite”与我的 xcdatamodel 不兼容,则应用程序必须崩溃。

但这仅适用于之前已创建的数据库。 例如,如果我尝试将一个名为“mydb.sqlite”的随机数据库放入我的包中并删除原来的数据库,

应用程序不会崩溃!!!创建一个空白数据库并忽略新数据库。 这是完全错误的,因为它违反了我的代码。

此外,如果我添加回原始数据库,则没有任何反应,应用程序只会创建一个空白数据库。

(是的,我确实清理了我的项目,删除了 sim 应用程序,甚至在发生任何更改之前删除了构建文件夹!)

有什么想法吗??

【问题讨论】:

你的错误是什么?可以发一下吗? 没有错误。这只是观察到没有按照我的代码应有的方式运行 【参考方案1】:

您的代码与您所说的期望之间存在差异。

这是您的期望:

    如果我的包中没有“mydb.sqlite”,则从头开始创建一个空的“mydb”。 如果我的主包中存在“mydb.sqlite”,那么我希望它被复制到指定的目录中。 如果“mydb.sqlite”与我的 xcdatamodel 不兼容,则应用程序必须崩溃。

这是您的代码的作用:

    在 Documents 目录中查找 mydb.sqlite 如果 mydb.sqlite 不存在,则从主包中复制它(如果它存在于主包中) 在 ~/Documents/mydb.sqlite 创建一个新的持久存储

我认为您遇到的主要问题是由于第 3 步。addPersistentStoreWithType:... 在提供的 URL 上创建了一个新商店。相反,您需要重新查询该文件的存在(以检查现在是否存在可能已从 MainBundle 复制的文件),如果存在,则使用 [persistentStoreCoordinator persistentStoreForURL:storeURL] 而不是创建新的持久存储。

一旦你解决了这个问题,其他问题应该更容易追踪。我建议在您的代码中添加更多 NSLog,以便您可以查看代码是否遵循您期望的执行路径。例如。记录您创建的每个新对象,以便您可以轻松查看其中是否有 nil。当你复制你的 bundle db 时,添加一个 NSError 指针而不是 NULL,然后如果错误不是 nil,则记录它。

【讨论】:

是的,抱歉。你说什么我期望什么。我没有在我的问题中说清楚。但是这不起作用。【参考方案2】:

问题/观察的答案很简单。

降级到 4.2.1

我已将我的 xcode 恢复到 4.2.1(感谢上帝提供了 Time Machine),现在一切正常。

我将在今天晚些时候向 Apple 提交错误报告。

【讨论】:

【参考方案3】:

检查您的默认数据库是否实际包含在捆绑包中 - 即检查它是否包含在项目中,并且处于复制文件构建阶段。我重新安排了一个项目和一个 SQLite 文件,同时将其复制到项目结构中,但未包含在我的项目中 - 这会导致您看到的行为。

【讨论】:

以上是关于coredata 在 xcode 4.3 上不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

无限 UIScrollView 在 iOS 4.3 上不起作用

为啥外部链接在构建后在 phonegap 应用程序上不起作用

“添加断点”快捷方式在 xcode 4.3 中不起作用

dismissViewControllerAnimated:completion: 方法替换在 Xcode4.6.1 上不起作用

XCode 设置以查看在以前的操作系统版本上不起作用的代码

iOS Firebase 推送通知在 Xcode 11.5 和 iOS 13 的模拟器上不起作用