2010-10-05 75 views
6

我在我的应用程序中使用iTunes文件共享,并且需要将Core Data的sqlite数据库放在其他地方,以便用户不要弄乱它。我已阅读a previous SO post关于隐藏Core Data使用的sqlite文件的最佳方法。当iTunes文件共享启用时隐藏核心数据sqlite文件

对于是将数据库放入Library/Preferences还是放在名为.data的目录中似乎存在矛盾的观点,但我认为最好的方法是使用.data目录。

目前是由核心数据模板代码提供了一个-applicationDocumentsDirectory方法:

- (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

我想实现一个名为applicationHiddenDocumentsDirectory功能,这将使我获得了“数据”子目录,但我不太了解Objective-C或Cocoa/Foundation框架来访问目录。

有人可以帮我实施这个方法吗?

谢谢!

== Rowan ==

回答

14

你觉得这个怎么样?如果发生错误,您必须添加适当的操作。
编辑:我改变了这个,所以数据库保存在库目录,这是由itunes备份和不可见的用户。这是由Apple Q&A

- (NSString *)applicationHiddenDocumentsDirectory { 
    // NSString *path = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@".data"]; 
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *path = [libraryPath stringByAppendingPathComponent:@"Private Documents"]; 

    BOOL isDirectory = NO; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) { 
     if (isDirectory) 
      return path; 
     else { 
      // Handle error. ".data" is a file which should not be there... 
      [NSException raise:@".data exists, and is a file" format:@"Path: %@", path]; 
      // NSError *error = nil; 
      // if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { 
      //  [NSException raise:@"could not remove file" format:@"Path: %@", path]; 
      // } 
     } 
    } 
    NSError *error = nil; 
    if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) { 
     // Handle error. 
     [NSException raise:@"Failed creating directory" format:@"[%@], %@", path, error]; 
    } 
    return path; 
} 
+0

良好的响应,并感谢链接Apple Q&A。在我引用的SO线程上有一些关于这个的讨论,但是我没有看到苹果的权威建议,直到你与它联系在一起。 – 2010-10-05 17:47:42

+1

是的,这是一个解决方案。但是,如何将其应用于3D方库,例如谷歌分析? “iphone文件共享GANTracker”是问题:( – slatvick 2010-12-02 10:10:39

5

建议作为新CoreData模板返回NSURL对象,而不是NSString的路径,这是我的更新上面的代码版本:

- (NSURL *)applicationHiddenDocumentsDirectory { 
    // NSString *path = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@".data"]; 
    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    NSString *path = [libraryPath stringByAppendingPathComponent:@"Private Documents"]; 
    NSURL *pathURL = [NSURL fileURLWithPath:path]; 

    BOOL isDirectory = NO; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDirectory]) { 
    if (isDirectory) { 
     return pathURL; 
    } else { 
     // Handle error. ".data" is a file which should not be there... 
     [NSException raise:@"'Private Documents' exists, and is a file" format:@"Path: %@", path]; 
     // NSError *error = nil; 
     // if (![[NSFileManager defaultManager] removeItemAtPath:path error:&error]) { 
     //  [NSException raise:@"could not remove file" format:@"Path: %@", path]; 
     // } 
    } 
    } 
    NSError *error = nil; 
    if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) { 
    // Handle error. 
    [NSException raise:@"Failed creating directory" format:@"[%@], %@", path, error]; 
    } 
    return pathURL; 
}