2011-05-14 120 views
0

我在添加到收藏夾功能工作中遇到了一些麻煩。 下面是我使用的設置爲收藏夾數據的陣列和字典代碼:添加到收藏夾功能

在應用程序的委託,在「appDidFinishLaunching」:

delegateFavouritesDictionary = [NSMutableDictionary dictionary]; 

NSLog(@"Mutable Dictionary: %@", delegateFavouritesDictionary); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

[delegateFavouritesDictionary writeToFile:filePath atomically: YES]; 

delegateFavouritesArray = [[NSMutableArray alloc] init]; 
我detailViewController

然後,我有一個addToFavourites功能:

if([[addToFavouritesDictionary allKeys] containsObject:ID]) { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

    [addToFavouritesDictionary removeObjectForKey:ID]; 
    [addToFavouritesArray removeObject:Name]; 
    [favouritesButton setTitle:@"+ Favourites" forState:(UIControlState)UIControlStateNormal]; 
    [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
    NSLog(@"New Dictionary: %@", addToFavouritesDictionary); 

} else { 

    [addToFavouritesArray addObject:Name]; 
    NSString *ID = [[NSUserDefaults standardUserDefaults]objectForKey:@"ID"]; 
    [addToFavouritesDictionary setObject:Name forKey:ID]; 
    [favouritesButton setTitle:@"- Favourites" forState:(UIControlState)UIControlStateNormal]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Saved.data"]; 

    [addToFavouritesDictionary writeToFile:filePath atomically: YES]; 
    NSLog(@"Mutable Dictionary: %@", addToFavouritesDictionary); 
    //[addToFavouritesDictionary release]; 
} 

上面的代碼按預期工作,在應用程序啓動時,「Saved.data」的字典,並加載內容設置到字典,然後在detailViewController,它加載了「保存。數據「文件並添加或取消對該文件進行授權。我遇到的問題是iPhone重新啓動,所有收藏夾數據都消失了,或者應用程序崩潰並再次打開,收藏夾中的所有數據都消失了。每當設備重新啓動或關閉時,是否有任何方法保存數據而不被刪除?

非常感謝提前。

+0

我沒有看到從任何地方的文件閱讀,這是一個錯字在問題中,或者你真的從來沒有讀過你的saved.data文件? – 2011-05-14 11:21:04

+0

在detailViewController中,我啓動了viewDidLoad方法中的addToFavouritesDictionary,我忘了添加該代碼。 – 2011-05-14 11:35:30

+0

好吧,看看我的答案,我想你只是在每次重新啓動時覆蓋你的數據。好吧,無論如何,我的數據並沒有從Documents文件夾中消失,僅僅是因爲我的iPhone已關閉,所以我沒有理由認爲你的數據應該被刪除。 – 2011-05-14 12:07:26

回答

0

爲什麼你不把它存儲在用戶偏好?

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
[prefs setObject:yourobject forKey:@"yourkey"]; 

或者SQLite中......

+0

謝謝,我會給你一個去,所以你會建議存儲在用戶prefs字典,然後加載到detailViewController? – 2011-05-14 11:09:23

+0

是的,這是我認爲的最簡單的方式。或者,如果你有最喜歡的噸,使用SQLite。 – Roki 2011-05-14 11:14:46

+0

好的,謝謝,通常最終用戶只有最多15到20個最愛,我看不到人有更多。 – 2011-05-14 11:16:14

0

好像你每次你的應用程序啓動覆蓋你的最愛,在appDidFinishLaunching要創建一個新的字典,並保存到saved.data,現在如果你讀它在detailViewController中會得到新的空字典。

這可以解釋爲什麼在iPhone重新啓動時使用數據的原因,因爲關閉設備並在設備上不會刪除保存在Documents目錄中的文件。這個目錄就在那裏,這樣你就可以保存你的數據並在重啓之間保持安全,否則它就沒有任何意義,然後它應該被稱爲「tmp」,而不是。

編輯

建議:在appDidFinishLoading只有一次加載,節省每一個變化或者只是同時使應用程序(applicationDidEnterBackground和/或applicationWillTerminate - 前者如果你支持多任務處理和否則後者),你應該沒問題。

編輯

我要做的就是使用的NSKeyedArchiver和NSKeyedUnarchiver,所以保存的數據:

[NSKeyedArchiver archiveRootObject: d toFile: filePath]; 

然後恢復:

NSMutableDictionary *d = [NSKeyedUnarchiver unarchiveObjectWithFile: filePath]; 
if (d == nil) { 
    d = [[NSMutableDictionary alloc] init]; 
} 

你也可以試試這個:+ (id)dictionaryWithContentsOfFile:(NSString *)path NSDictionary類從文件中獲取字典:

delegateFavouritesDictionary = [NSMutableDictionary dictionaryWithContentsOfFile: filePath]; 
if (delegateFavouritesDictionary == nil) { 
    delegateFavouritesDictionary = [[NSMutableDictionary alloc] init]; 
} 

如您所見,您不必檢查文件是否存在,因爲如果出現任何錯誤,您將得到零,在這種情況下,您將創建一個空實例。

+0

好的,在appDidFinishLaunching中,我應該檢查文件是否先存在,如果不存在,創建文件,如果存在,只是加載它? – 2011-05-14 17:12:37

+0

僅當它尚未從文件中加載時,這就是爲什麼只有在delegateFavouritesDictionary爲零(使用(!delegateFavouritesDictionary)進行檢查)時才這樣做。我現在認爲,如果明確覈對無,我已經編輯了答案,這會更清楚。 – 2011-05-15 10:31:49

+0

所以在開始的時候你首先嚐試加載,如果有效的話,你已經準備好了,並且已經有了你的最愛。否則,您將創建一個空的字典,準備由應用程序填充。現在在適當的時候(例如退出應用程序時),您必須保存它,以便能夠在下次啓動時加載。 – 2011-05-15 10:33:44