默认的Core Data for iOS模板将数据存储在.sqlite
的{{1}}文件中。如果iDevice连接到iTunes并且启用了文件共享,则该文件可见。
我想将目录更改为用户不可见的内容,我会选择NSDocumentDirectory
。这是正确的目录吗?其他开发人员使用什么?
答案 0 :(得分:7)
最佳位置(在iPhone上)是Library文件夹,如下所述:
How can I get a writable path on the iPhone?
该目录适用于您不希望用户通过共享查看的数据库。
答案 1 :(得分:6)
Application Support目录是放置它的好地方,按照惯例(从Mac OS X),您应该使用以您的应用程序命名的Application Support中的子目录。对于iOS,它放置文件时真的不重要,因为它无论如何都不是用户可访问的,但请记住:
这是一篇不错的博客文章,其中包含获取正确的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];
}