2010-10-05 21 views
6

Tôi đang sử dụng chia sẻ tệp iTunes trong ứng dụng của mình và cần phải đặt cơ sở dữ liệu sqlite của Core Data ở nơi khác để người dùng không fiddle với nó. Tôi đã đọc a previous SO post về cách tốt nhất để ẩn tệp sqlite mà Dữ liệu chính sử dụng.Ẩn tệp sqlite dữ liệu lõi khi chia sẻ tệp iTunes được bật

Dường như có ý kiến ​​mâu thuẫn về việc đặt cơ sở dữ liệu trong Thư viện/Tuỳ chọn hoặc trong thư mục có tên .data, nhưng tôi nghĩ rằng tôi đồng ý cách tốt nhất là sử dụng thư mục .data.

Hiện nay là một phương pháp -applicationDocumentsDirectory đã được cung cấp bởi Core dữ liệu mẫu mã:

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

Tôi muốn thực hiện một chức năng gọi là applicationHiddenDocumentsDirectory rằng sẽ cho tôi truy cập vào ".data" thư mục con, nhưng Tôi không biết đủ về các khung Objective-C hoặc Cocoa/Foundation để truy cập vào thư mục.

Ai đó có thể giúp tôi triển khai phương pháp này không?

Cảm ơn!

== Rowan ==

Trả lời

14

Bạn thích cái này như thế nào? Bạn phải thêm hành động thích hợp nếu xảy ra lỗi.
EDIT: Tôi đã thay đổi điều này để cơ sở dữ liệu được lưu trong thư mục-thư mục, được sao lưu bởi itunes và không hiển thị cho người dùng. Điều này đã được đề xuất bởi 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

phản ứng tuyệt vời, và nhờ các liên kết đến Apple Q & A. Có một chút thảo luận về điều này trên chủ đề SO mà tôi đã tham chiếu, nhưng tôi không thấy lời khuyên có thẩm quyền từ Apple cho đến khi bạn liên kết với nó. –

+1

Vâng, đó là một giải pháp. Nhưng cách áp dụng nó cho libs của bên thứ ba, ví dụ: Google Analytics? "chia sẻ tập tin iPhone GANTracker" là vấn đề :( – slatvick

5

Như mẫu CoreData mới trở NSURL đối tượng chứ không phải là con đường NSString, đây là phiên bản cập nhật của tôi về đoạn code trên:

- (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; 
} 
Các vấn đề liên quan