带有核心数据的预加载数据库

时间:2012-03-27 12:38:56

标签: ios core-data

我正在尝试为我的通用应用程序使用预加载的Sqlite数据库,该应用程序使用核心数据。它适用于iOS 4.3,但不适用于iOS 5.0+,我使用的是Xcode 4.3。

我看了下面的链接,进行了更改,更改了,但无济于事,现在预加载根本不起作用。

Prepopulate Core Data in iOS 5

coredata problem nsurl may not respond to stringByAppendingPathComponent

我做错了什么,我在下面列出了我的代码,我们将非常感谢任何帮助。谢谢你的时间。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{

    if (persistentStoreCoordinator != nil) 
    {
        return persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"SAP_ECC_DB.sqlite"];
    //NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"SAP_ECC_DB.sqlite"];

     //Set up the store.
     //For the sake of illustration, provide a pre-populated default store.
    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    if (![fileManager fileExistsAtPath:storePath]) 
    {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"SAP_ECC_DB" ofType:@"sqlite"];
        if (defaultStorePath) 
        {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];    
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    NSError *error;
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    } 



- (NSString *)applicationDocumentsDirectory
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
    //return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

1 个答案:

答案 0 :(得分:2)

有时,尤其是在XCode 4.3中,即使您将资源添加到项目文件列表中,它也不会包含在最终产品中,或者无缘无故地将其删除。如果您遇到的问题是您的产品没有更新,没有出现,或者出于任何原因而无法正常运行,请检查以确保它实际包含在“复制包资源”中(有时甚至.m文件丢失,这些将在您项目的Build Phases选项卡的Compile Sources中。

这个特别棘手,因为Core Data会创建一个新的数据库(如果一个不存在),使它看起来好像没有复制,而实际上它并不存在。