2010-10-05 50 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; 
} 
相關問題