我正在尝试使用以下代码将我的 sqlite 文件从应用程序包复制到文档目录中
-(id)init {
self = [super init];
if (self) {
// 1. 为 UIManagedDocument 创建数据库文件的句柄
NSURL *docURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
docURL = [docURL URLByAppendingPathComponent:@"DefaultDatabase"];
self.document = [[UIManagedDocument alloc] initWithFileURL:docURL]; // URL of the location of document i.e. /documents directory
NSLog(@" URL document");
//set our document up for automatic migrations
if (self.document) {
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES],
NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
self.document.persistentStoreOptions = options;
// Register for Notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectsDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.document.managedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:self.document.managedObjectContext];
} else {
NSLog(@"The UIManaged Document could not be initialized");
}
// 2. 首次运行时检查持久化存储文件是否不存在
if (!([[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])) {
NSLog(@" persistent file not found trying to copy from app bbundle");
NSString *docFileName = [UIManagedDocument persistentStoreName];
NSString *docFilePath = [[NSBundle mainBundle] pathForResource:docFileName ofType:@"sqlite"];
**NSLog(@" doc file path = %@", docFilePath);**
if (docFilePath) { // found the database file in app bundle
NSLog(@" found file in bundle");
//Production: Copy from app bundle.
NSError *error = nil;
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *copyToPath = [searchPaths lastObject];
if([[NSFileManager defaultManager] copyItemAtPath:docFilePath toPath:copyToPath error:&error]){
NSLog(@"File successfully copied");
} else { // if could not locate the file
[[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"error", nil) message: NSLocalizedString(@"failedcopydb", nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"ok", nil) otherButtonTitles:nil] show];
NSLog(@"Error description-%@ \n", [error localizedDescription]);
NSLog(@"Error reason-%@", [error localizedFailureReason]);
}
}
}
}
return self;
}
a) 我使用数据加载器应用程序创建了 .sqlite 文件,该应用程序使用 UIManagedDcoument 将数据添加到核心数据。.sqlite 文件在文档目录中生成。
b)我将 *.sqlite 文件添加到资源文件夹并将其添加到捆绑包中。如果我使用终端检查应用程序包。我会<app name.momd>
在包目录下看到“持久存储”和文件。没有扩展名为 .sqlite 的文件
c)但是在我上面的代码中,当我使用代码行检查应用程序包中是否存在文件时,它是成功的。所以文件存在于包中
NSString *file = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:fileName];
d)但是当尝试复制时,它会失败并给我(Cocca 错误 206),这意味着它无法在应用程序包中找到 .sqlite 文件。
if([[NSFileManager defaultManager] copyItemAtPath:file toPath:copyToPath error:&error])
这与我在应用程序包目录下看不到 .sqlite 文件相反我看到持久存储和 .momd 文件的事实一致。
那么我哪里出错了?
编辑
这是对我如何生成 mydata.sqlite 文件的说明。
我正在使用 Core Data,并希望在首次向用户启动应用程序时提供一个预先填充的数据库。所以我使用数据加载器应用程序为我创建 .sqlite 文件。我将 UIManagedDocument 用于核心数据。运行应用程序后,我看到在文档目录下创建了一个 mydata.sqlite 目录。目录结构如下
/users//.../documents/mydata.sqlite/storeContent/persistenStore。
所以基本上不是创建文件,而是创建一个扩展名为 .sqlite 的目录,我看到了 persistentStore 文件。因此,当我尝试在构建阶段下的目标中复制应用程序包下的资源时,它会添加 persistentStore 而不是 .sqlite 文件。
我的问题所描述的都是正确的,我应该在我的代码中以不同的方式处理它。如果是的话,我应该怎么做才能处理数据存储。
我认为 .sqlite 是一个文件而不是一个目录。请指导
谢谢