2011-09-19 66 views
2

可能重複:這裏
iOS store just a little bit of data在OS X/Cocoa中存儲數據的首選方法?

新的OS X開發。我有一小部分用戶數據需要存儲(實際上只是最近打開的文件的路徑)。在Cocoa土地上儲存這些東西的首選方式是什麼?我之前聽說過Core Data,但作爲一個Windows開發人員,他遇到過很多來自MS的API,有沒有人真的使用過這個?

當然,我可以把所有的東西都寫到我自己的文件中,但我更喜歡做正確的方式(TM)。

任何建議將是偉大的!

+0

也許如果你編輯的問題,使其更一般。 –

+0

@StevenFisher,唯一的區別是問題的標記方式。這裏的問題實際上只是「我如何存儲一些沒有Core Data的數據」,在這方面Cocoa和Cocoa Touch是一樣的。我會給另一個問題添加一個標籤,使其更加通用。 – Caleb

+0

這與其他文章有很大不同**,它處理保存對文件的引用(並且以持久方式引用文件的最佳方式是使用Alias(「書籤」)數據,而不是**純文件路徑)。 – NSGod

回答

7

如果您的應用程序是基於文檔的,則會自動爲您存儲最近打開的文件列表。如果你需要自己保存,那麼我會建議使用NSUserDefaults。這是存儲輕量級信息(如首選項和最近使用的項目)的最常見方式。

是的,人們確實使用核心數據,但它通常用於更復雜的數據,例如具有不同部分的文檔。

3

請參閱my answerthis thread五個關於存儲數據的建議。雖然該線程覆蓋iOS,因此Cocoa Touch代替Cocoa,但答案几乎相同。

請注意,第一個答案NSUserDefaults用於保存應用偏好等數據。如果應用程序總是希望加載相同的一組數據,那麼這可能是最合適的;如果數據更像是一個文檔,那麼您可能會在不同的文件中存儲不同的數據集,您應該使用其他方法之一。寫一個屬性列表可能會是簡單的在這種情況下:

// store some words in an array and write to a file at pathToFile 
NSMutableArray *array = [NSMutableArray array]; 
[array addObjects: @"foo", @"bar", @"baz", nil]; 
[array writeToFile:pathToFile]; 

// (later) read contents of the file at pathToFile into a new array 
NSArray *words = [NSArray arrayWithContentsOfFile:pathToFile]; 

至於核心數據,是的,很多人使用它。這是管理持久對象的一種非常好的方式。但是,它聽起來像是存儲一堆路徑的方式。

0

正如ughoavgfhw提到的那樣,NSDocument體系結構已經負責保留最近的文檔列表。 (如果您查看您的首選項文件夾,*.LSSharedFileList.plist首選項文件保存此數據)。

如果您在Property List Editor或Xcode 4中查看這些文件,您將看到以持久方式存儲對文件的引用的首選方式是使用Alias(或「Bookmark」)數據。如果您來自Windows/* nix背景,別名數據可以跟蹤某個項目,即使它已被重命名或移動。

如果您需要自行存儲最近使用的文件列表,並且可能需要OS X 10.6+,則可以使用NSUserDefaults以及NSURL中的書籤數據功能。

在打開的文件你的方法,你可以做這樣的事情:

NSString * const MDRecentDocumentsKey = @"MDRecentDocuments"; 


- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { 
    // assume single item 
    NSURL *URL = [NSURL fileURLWithPath:[filenames objectAtIndex:0]]; 

    NSMutableArray *recentAppBookmarks = 
    [[[[NSUserDefaults standardUserDefaults] objectForKey:MDRecentDocumentsKey] 
               mutableCopy] autorelease]; 
    // assume 20 item limit 
    if ([recentAppBookmarks count] + 1 > 20) { 
     [recentAppBookmarks removeLastObject]; 
    } 

    NSData *data = [ bookmarkDataWithOptions:0 includingResourceValuesForKeys:nil 
     relativeToURL:nil error:NULL]; 

    [recentAppBookmarks insertObject:data atIndex:0]; 

    [[NSUserDefaults standardUserDefaults] setObject:recentAppBookmarks 
            forKey:MDRecentDocumentsKey]; 


} 

要獲得最近的文件在應用程序啓動列表中,你可以做這樣的事情:

- (void)awakeFromNib { 
    recentAppURLs = [[NSMutableArray alloc] init]; 

    NSArray *recentAppBookmarks = 
    [[NSUserDefaults standardUserDefaults] objectForKey:MDRecentDocumentsKey]; 

    for (NSData *bookmarkData in recentAppBookmarks) { 
     NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmarkData 
    options:NSURLBookmarkResolutionWithoutUI|NSURLBookmarkResolutionWithoutMounting 
      relativeToURL:nil bookmarkDataIsStale:NULL error:NULL]; 
     if (resolvedURL) [recentAppURLs addObject:resolvedURL]; 
    } 

} 

否則,如果您需要與OS X 10.5及更早版本兼容,我在NSStringin this answer上發佈了一些類別。

+1

網址書籤和別名不是一回事。類似的想法,但它們不可互換:不能將書籤數據傳遞給別名管理器,也不能將數據別名傳遞給NS/CFURL。 –