如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1
Posted
技术标签:
【中文标题】如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1【英文标题】:How to import a pre-existing sqlite file into core data iOS 7.1 【发布时间】:2014-04-17 19:00:01 【问题描述】:我创建了一个新的核心数据项目并设置了我的核心数据模型。然后我在模拟器中运行它,然后保存上下文。然后我使用 Core Data Editor 5 打开并查看我的数据库。我添加并编辑了新的授权,保存了文件,然后我进入模拟器检查它是否有效,并且所有内容都已添加并且看起来很好。我现在想将此数据库添加到我的项目包中,并让应用程序将此 bata 库加载为其默认核心数据库。有了新的 wal 系统,我似乎无法让它工作。我想知道是否有人知道如何解决它。我听说你必须添加所有 3 个文件(.sqlite、wal、shm),但我不知道具体保存在哪里或通过什么过程来完成。
【问题讨论】:
【参考方案1】:将这三个都作为资源添加到您的 ios 应用程序中。那么
NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"myfilename" ofType:@"myfileextension"]];
并在对-addPersistentStoreWithType:configuration:...
的调用中将其传递给您的NSPersistentStoreCoordinator
。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
if (_persistentStoreCoordinator != nil)
return _persistentStoreCoordinator;
NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"myfilename" ofType:@"myfileextension"]];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:@NSReadOnlyPersistentStoreOption : @YES,
NSSQLitePragmasOption: @ @"journal_mode" : @"WAL"
error:&error])
/*
Replace this implementation with code to handle the error appropriately.
*/
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
return _persistentStoreCoordinator;
虽然给了你那个 sn-p,但我不是这样做的,我不知道它会起作用。相反,如果我正在创建一个静态数据存储以用作只读数据,当我创建数据存储(在另一个工具或程序中)以及在我的实际 iOS 应用程序中读取它时,我将使用旧的 DELETE
日志模式。这意味着更改options:
参数(在创建代码和读取代码上)。
options:@NSReadOnlyPersistentStoreOption : @YES,
NSSQLitePragmasOption: @ @"journal_mode" : @"DELETE"
http://www.sqlite.org/draft/wal.html 声明“无法打开只读 WAL 数据库。”进一步讨论http://www.sqlite.org/draft/wal.html#readonly。
【讨论】:
以上是关于如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1的主要内容,如果未能解决你的问题,请参考以下文章
如何用应用商店中的新版本替换 iOS 应用中预先填充的核心数据?
Iphone 编程 - 将现有的 sql 表导入到 sqlite 或核心数据