在哪里存储核心数据文件?
默认的Core Data for iOS模板将数据存储在NSDocumentDirectory
中的.sqlite
文件中。 如果iDevice连接到iTunes并启用了文件共享,则该文件是可见的。
我想改变目录到用户不可见的东西,我会selectNSApplicationSupportDirectory
。 这是正确的目录吗? 其他开发人员使用什么?
最好的地方(在iPhone上)是库文件夹,如下所述:
我怎样才能得到一个可写的path在iPhone上?
该目录适用于您不希望用户能够通过共享查看的数据库之类的内容。
应用程序支持目录是一个放置它的好地方,按照惯例(从Mac OS X),应该在应用程序支持中使用一个以应用程序命名的子目录。 对于iOS来说,放置文件的位置并不重要,因为无论如何都不是用户可访问的,但请记住:
- 如果您已经启用了文档共享(或者其他所谓的),那么Documents目录在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]; }
- 集合函数上的iOS FetchRequest:如何包含挂起的更改?
- 我应该如何将UIImage存储在我的Core Data数据库中?
- 如何获取viewController的managedObjectContext,而不是从appDelegate获取?
- 在多对多关系中的KVO对象属性
- 使用另一个expression式作为sum:expression的参数从NSManagedObject获取聚合数据
- CoreData问题: – :无法识别的select器发送到实例
- 完整CoreData上传(备份)到iCloud驱动器,并在需要时进行恢复
- 不能使用比较魔法logging中的date的谓词
- dynamicUITableView与核心数据对象的高度