iOS - 将 sqlite 复制到 CoreData 的捆绑包

Posted

技术标签:

【中文标题】iOS - 将 sqlite 复制到 CoreData 的捆绑包【英文标题】:iOS - Copy sqlite to bundle for CoreData 【发布时间】:2012-09-06 23:29:05 【问题描述】:

这是我所做的: 使用应用程序的填充版本创建了 sqlite 文件。 将该文件复制到我的应用程序包中,确保目标已设置并且它存在于“复制包资源”中

然后我尝试像这样填充核心数据:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
  

if (_persistentStoreCoordinator != nil) 
    return _persistentStoreCoordinator;

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestModel.sqlite"];


if( ![[NSFileManager defaultManager]
      fileExistsAtPath:[storeURL path]] ) 
    // If there’s no Data Store present (which is the case when the app first launches), identify the sqlite file we added in the Bundle Resources, copy it into the Documents directory, and make it the Data Store.
    NSString *sqlitePath = [[NSBundle mainBundle]
                            pathForResource:@"TestModel" ofType:@"sqlite"
                            inDirectory:nil];
    NSError *anyError = nil;
    BOOL success = [[NSFileManager defaultManager]
                    copyItemAtPath:sqlitePath toPath:[storeURL path] error:&anyError];

    if(success)
        NSLog(@"sucess, loading into store");
        NSError *error = nil;
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 

            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        else
            NSLog(@"error with sqlite file");
        
    


return _persistentStoreCoordinator;

但我收到此错误:

NSFileManager copyItemAtPath:toPath:error:]: source path is nil

我做错了什么?是说在bundle中找不到sqlite文件吗?

【问题讨论】:

【参考方案1】:

我认为这是因为当我将文件从 Finder 导入 Xcode 时,它​​被命名为“TestModel”而不是“TestModel.sqlite”。

【讨论】:

【参考方案2】:

来自文档

bundlePath -- ***捆绑目录的路径。这必须是有效路径。例如,要为 Mac 应用程序指定捆绑目录,您可以指定路径 /Applications/MyApp.app。

*edit: 我想我的方法不对 :( 不过还是试试这个吧!-> 为什么不使用- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension?跳过目录(因为你不想要一个)。

【讨论】:

使用这个:NSString *sqlitePath = [[NSBundle mainBundle] pathForResource:@"TestModel" ofType:@"sqlite"];仍然给我一个空源路径 这很奇怪,试试- (NSArray *)pathsForResourcesOfType:(NSString *)extension inDirectory:(NSString *)subpath如果你为你的扩展和子路径提供nil,这应该会列出你所有的文件。 这样做了:NSLog(@"all: %@", [[NSBundle mainBundle] pathsForResourcesOfType:@"sqlite" inDirectory:nil]);得到一个空数组。所以找不到sqlite文件...

以上是关于iOS - 将 sqlite 复制到 CoreData 的捆绑包的主要内容,如果未能解决你的问题,请参考以下文章

如何存储数据库IOS程序[关闭]

将sqlite文件从一个项目复制到另一个项目

xcode sqlite3 如何将数据库从捆绑包复制到文档文件夹?

如何在 ios 中打开一个 sqlite 文件进行阅读而不复制到文档?

在iOS中启动应用程序时如何复制sqlite数据库?

java怎么用IO流把一个文件(SQLite数据库文件)复制到另一个位置