存储Core Data文件的位置?

时间:2010-12-24 10:21:48

标签: iphone objective-c core-data ios

默认的Core Data for iOS模板将数据存储在.sqlite的{​​{1}}文件中。如果iDevice连接到iTunes并且启用了文件共享,则该文件可见。

我想将目录更改为用户不可见的内容,我会选择NSDocumentDirectory。这是正确的目录吗?其他开发人员使用什么?

4 个答案:

答案 0 :(得分:7)

最佳位置(在iPhone上)是Library文件夹,如下所述:

How can I get a writable path on the iPhone?

该目录适用于您不希望用户通过共享查看的数据库。

答案 1 :(得分:6)

Application Support目录是放置它的好地方,按照惯例(从Mac OS X),您应该使用以您的应用程序命名的Application Support中的子目录。对于iOS,它放置文件时真的不重要,因为它无论如何都不是用户可访问的,但请记住:

  • 如果您已经启用了文档共享(或其他任何内容),则文档目录在iTunes中可见。正如您已经发现的那样。
  • 当用户安装新版本的应用时,不会保存Caches目录。

这是一篇不错的博客文章,其中包含获取正确的Application Support子目录的实现:http://cocoawithlove.com/2010/05/finding-or-creating-application-support.html

答案 2 :(得分:1)

您可以使用点(“.myData.sqlite”)启动文件名,它将隐藏在Documents目录中。 更好的是将一个子文件夹放入“.hidden /”,然后你就可以把你想要的东西放在那里,而不用担心文件名。

答案 3 :(得分:1)

我确实把我的Core-Data-File放到了库目录的子目录中 到现在为止,我对此决定感到遗憾。在我的应用程序的下一个版本中,用户可以再次访问该数据库。我将它重命名为database.sqlite,并在我的支持页面上放置一个FAQ条目,告诉用户该文件的用途。 发生在我的应用程序中的99.9%的崩溃是因为数据库在某种程度上被破坏了。并且他们无法将该文件发送给我,因为他们无法访问它。所以我无法找出问题所在。

这是我用来访问私人目录的代码。它位于LibraryDirectory中,因此iTunes会自动备份它。

+ (NSString *)createAndReturnDirectory:(NSString *)path {
    BOOL isDirectory = NO;
    if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) {
        if (isDirectory)
            return path;
        NSError *error = nil;
        if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) {
            // do something. 
                    return nil;
        }
    }
    NSError *error = nil;
    if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) {
        // do something.
            return nil;
    }
    return path;
}

+ (NSString *)applicationPrivateDocumentsDirectory {
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [libraryPath stringByAppendingPathComponent:@"Private Documents"];
    return [self createAndReturnDirectory:path];
}