coredata没有在xcode 4.3上工作?

时间:2012-02-26 10:25:31

标签: iphone xcode core-data

只是想知道是否有其他人遇到过此事。

我在以前的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;
}

我希望以下内容:

  1. 如果我的包中没有“mydb.sqlite”,则从头开始创建一个空的“mydb”。
  2. 如果我的主包中存在“mydb.sqlite”,那么我希望它会被复制到指定的diretory中。
  3. 如果“mydb.sqlite”与我的xcdatamodel不兼容,则该应用必须崩溃。
  4. 然而,这仅适用于先前已创建的db。 例如,如果我尝试将名为“mydb.sqlite”的随机数据库放入我的包中并删除原始数据库,那么

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

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

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

    任何想法??

3 个答案:

答案 0 :(得分:0)

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

这是您的期望:

  1. 如果我的包中没有“mydb.sqlite”,则从头开始创建一个空的“mydb”。
  2. 如果我的主包中存在“mydb.sqlite”,那么我希望将其复制到指定的目录中。
  3. 如果“mydb.sqlite”与我的xcdatamodel不兼容,则该应用必须崩溃。
  4. 以下是您的代码所做的事情:

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

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

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

答案 1 :(得分:0)

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

降级至4.2.1

我已将我的xcode恢复到4.2.1(感谢God for Time Machine),现在ALL已按预期进行。

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

答案 2 :(得分:0)

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