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

Posted

技术标签:

【中文标题】带有核心数据的预加载数据库【英文标题】:Preloaded database with core data 【发布时间】:2012-03-27 12:38:55 【问题描述】:

我正在尝试为我的通用应用程序使用预加载的 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];

【问题讨论】:

在什么方面不起作用?文件是否复制?数据不显示?你有错误吗? 文件没有复制,因此没有数据出现。我没有收到任何错误。 你能确认它确实存在于包中吗?它应该出现在构建阶段选项卡的复制捆绑资源部分中。有时 xcode 4.3 会变得讨厌并无缘无故地删除它们。 也许如果你没有输入error:NULL];,你可能会看到你得到的错误;) @borrrden,哇,好用,节省了一天,我将它添加到项目中,但我想我需要检查构建阶段选项卡以确定。非常感谢,如果您发布答案,我会接受。 【参考方案1】:

有时,尤其是在 XCode 4.3 中,即使您将资源添加到项目文件列表中,它也不会包含在最终产品中,或者会无缘无故地被删除。如果您遇到产品没有更新、没有出现或由于某种原因没有正常运行的问题,请检查以确保它实际上包含在“复制捆绑资源”中(有时甚至 .m 文件也会丢失,这些将在项目的“构建阶段”选项卡的“编译源”中)。

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

【讨论】:

以上是关于带有核心数据的预加载数据库的主要内容,如果未能解决你的问题,请参考以下文章

带有更新的预填充数据库的 Android Room 迁移

如何从 Laravel 上的预加载中获取嵌套数据?

考虑 application.properties 的预加载数据的 Spring 数据最佳实践

iis的预加载已启用要开吗?

js图片预加载

ViewPager和Fragment的综合使用的预加载机制