在哪里存储核心数据文件?

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

我想改变目录到用户不可见的东西,我会selectNSApplicationSupportDirectory 。 这是正确的目录吗? 其他开发人员使用什么?

最好的地方(在iPhone上)是库文件夹,如下所述:

我怎样才能得到一个可写的path在iPhone上?

该目录适用于您不希望用户能够通过共享查看的数据库之类的内容。

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

  • 如果您已经启用了文档共享(或者其他所谓的),那么Doc​​uments目录在iTunes中是可见的,正如您已经发现的那样。
  • 用户安装新版本的应用程序时,不会保存Caches目录。

这里有一个很好的博客文章,其中包含获取正确应用程序支持子目录的实现: http : //cocoawithlove.com/2010/05/finding-or-creating-application-support.html

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

我确实把我的Core-Data-File放到了library目录的子目录中。
现在我很后悔这个决定。 在我的应用程序的下一个版本中,数据库将再次被用户访问。 我将它重新命名为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]; }