我已经解决这个问题一周了,我用谷歌搜索了堆栈溢出,阅读了大约 40 篇文章,仍然无法解决我的问题。这是我所做的: 1.我编写了一个测试应用程序来创建 sqlite 数据库,并用数据预加载它。2.我创建了myApp,并将预加载的数据库复制到资源文件夹。3.我写了以下代码来获取数据库:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (!self.myDataBase) {
NSURL *url = [self localDocumentsDirectoryURL];
url = [url URLByAppendingPathComponent:@"myDB/"];
self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
}
return YES;
}
-(NSURL*)localDocumentsDirectoryURL {
static NSURL *localDocumentsDirectoryURL = nil;
if (localDocumentsDirectoryURL == nil) {
NSString *documentsDirectoryPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory,NSUserDomainMask, YES ) objectAtIndex:0];
localDocumentsDirectoryURL = [NSURL fileURLWithPath:documentsDirectoryPath];
}
return localDocumentsDirectoryURL;
}
- (void)useDocument
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.ICCarDataBase.fileURL path]])
{
[self.ICCarDataBase saveToURL:self.ICCarDataBase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
}
else
{
[self.ICCarDataBase openWithCompletionHandler:^(BOOL success) {}];
}
}
- (void) setICCarDataBase:(UIManagedDocument *)carDataBase
{
if (_ICCarDataBase != carDataBase) {
_ICCarDataBase = carDataBase;
[self useDocument];
}
}
然后当我在模拟器中运行 myApp 时,myApp 成功获取了数据库数据,而当我在我的 iPhone 中运行它时,myApp 无法获取数据库数据。我不知道SDK版本是否重要,因为模拟器是iphone 5.1,而我的iPhone是5.0(越狱)。而且我没有在我的应用程序中使用任何 5.1 特定功能。
有人说您应该先将数据库复制到文档目录才能使其正常工作,我已经尝试了该解决方案,在模拟器中仍然可以正常工作,但在 iPhone 中没有数据。另外,我使用 iTool 查看了 iphone 文件夹,myDB 文件夹已经在文档目录中。帖子建议解决方案在这里:Pre-load core data database in iOS 5 with UIManagedDocument
其他人说我应该直接使用persistentStoreCoordinator。但我认为 UIManagedDocument 可以在我的情况下工作,因为它本身创建了一个隐式的 persistentStoreCoordinator。
关于 myApp 有什么问题的任何建议?
任何人都可以告诉我为什么 ios 用两层文件夹包装 sqlite DB,并命名实际的 sqlite db persisentStore?