0

我已经解决这个问题一周了,我用谷歌搜索了堆栈溢出,阅读了大约 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?

4

1 回答 1

0

我已经解决了这个问题,感谢这篇文章iPhone: Can access files in documents directory in Simulator, but not device

在这篇文章中,他引用了这个博客:Xcode resource groups and folder references when building for iPhone

解决我的问题后,我开始意识到预加载 sqlite 数据库在设备中不起作用的原因是:当 Xcode 将数据库从捆绑包复制到设备时,包装persistentStore 的文件夹层(myDB/StoreContent/persistentStore)是删除。因此,在 myApp.app 包中只有一个 persistentStore 文件与设备中的所有其他文件混合在一起。而当你使用 UIManagedDocument 访问 sqlite 数据库时,它只能在这样的目录结构中使用 sqlite:myDB/StoreContent/persistentStore。因此,只有一个裸的 persistentStore 文件,UIManagedDocument 将为您创建一个全新的目录结构,其中包含一个空的 persistentStore。

如果有人可以建议 UIManagedDocument 在没有文件夹层的情况下使用persistentStore 文件的方法,我会很感兴趣。

在我成功复制设备包中的目录结构后,我使用此代码访问数据库:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (!self.myDataBase) {
        NSURL *url = [[NSBundle mainBundle] resourceURL];
        url = [url URLByAppendingPathComponent:@"myDB/"];
        self.myDataBase = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    return YES;
}
于 2012-09-17T02:49:11.523 回答