2011-04-02 66 views
3

在我爲一個學校項目創建的iOS應用程序中,我無法保存存儲在NSMutableArray中的數據。該數組是在應用程序委託文件中創建的,然後委託它在各種其他視圖控制器文件中創建。存儲在數組中的數據由由NSStrings和NSNumbers組成的自定義類作爲屬性組成。如何在iOS中保存充滿自定義類的數組?

我已經閱讀並遵循了這個網站上的大量例子,現在已經有一個星期左右的時間了,但是我不能爲我的生活弄清楚它。我也研究過核心數據,但我無法弄清楚如何在沒有徹底重新開始的情況下實現這一點,並且不幸的是我時間緊迫。

事情我已經嘗試:

歸檔在WillTerminate方法。 (activityArray是我的數組)

- (void)applicationWillTerminate:(UIApplication *)application { 
NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString* arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"]; 
[NSKeyedArchiver archiveRootObject:activityArray toFile:arrayFile]; 
[activityArray release]; 

然後在AppDelegate中的didFinishLaunchingWithOptions方法解除存檔文件

NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSString *arrayFile = [documentsPath stringByAppendingPathComponent:@"arrayFile"]; 
if ([fileManager fileExistsAtPath:arrayFile]) { 
    NSLog(@"yes"); 
    activityArray = [NSMutableArray arrayWithContentsOfFile:arrayFile]; 
} else { 
    activityArray = [[NSMutableArray alloc] init]; 
} 

按照對其他問題的建議,我的確在自定義類以下我有(這個類有2個NSString,activityName和activityDescription)。

- initWithCoder:(NSCoder *)aCoder { 
self = [super init]; 
activityName = [[aCoder decodeObjectForKey:@"activityName"] retain]; 
activityDescription = [[aCoder decodeObjectForKey:@"activityDescription"] retain]; 
return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder { 
[aCoder encodeObject:activityName forKey:@"activityName"]; 
[aCoder encodeObject:activityDescription forKey:@"activityDescription"]; 
} 

但這一切似乎都不適用於我。感謝任何幫助。我覺得這應該是一件相當容易的事情,但我似乎無法得到它。

+1

你是什麼意思,「這似乎沒有工作」?歸檔不起作用嗎?還是取消存檔?你看到正在創建的文件嗎?您的歸檔方法看起來很奇怪。你爲什麼要發佈activityArray?你爲什麼似乎試圖存檔兩次? – 2011-04-02 15:49:03

+0

哦哇,複製並粘貼錯誤。修復了雙歸檔的事情。並且在應用程序關閉時是否應該釋放它?至於什麼不起作用,當我完全關閉應用程序並重新打開它時,以前在activityArray中的所有數據都不存在。我不確定它是否在加載或保存方面存在問題。 – Djmorrsee 2011-04-02 19:21:49

回答

1

核心數據實際上非常簡單且快速實施。我在幾個月前快速設置了一個blog post。只需讓實體代表您創建的不同類,或者自己添加@dynamic屬性即可。

請記住,Core Data的行爲與Array相同,因爲只能存儲對象。因此你需要爲int \ float使用NSNumber等。

+0

我認爲這是我將要遵循的路線,因爲我現在可以在未來學習它。我今晚要試試這個。 – Djmorrsee 2011-04-03 01:33:17

+0

我決定重寫我的部分代碼以使用核心數據,它的功能就像一個魅力!謝謝,你鏈接到的博客文章太棒了。 – Djmorrsee 2011-04-06 22:48:41

+0

非常高興它幫助:) – 2011-04-06 23:19:26

0

您可以使用NSUserDefaults的像這樣保存數組:

NSData *theData = [NSKeyedArchiver archivedDataWithRootObject:activityArray]; 
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:@"myArray"]; 

然後你可以檢索保存對象如下:

NSData *theData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myArray"]; 
NSArray *activityArray = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:theData]; 

然而,對於這個工作,你必須實現的initWithCoder併爲您提到的任何自定義對象編碼WithCoder方法。

+0

你會建議如何放置這些?顯然加載似乎是didFinishLaunchingWithOptions,但是一個nslog測試表明,這個方法並沒有被調用,即從跳板啓動應用程序。 – Djmorrsee 2011-04-02 18:14:14

+0

如果應用程序支持多任務並且正在從後臺恢復,則不會調用didFinishLaunchingWithOptions。爲此,您必須將applicationWillEnterForeground和applicationDidEnterBackground委託方法與didFinishLaunchingWithOptions和applicationWillTerminate結合使用。 – bala 2011-04-03 18:00:21

0

你真的檢查過你的存檔代碼是否被執行了嗎?在支持多任務處理的iOS 4下,applicationWillTerminate:實際上從未被調用過。您應該考慮將代碼放入applicationDidEnterBackground:

至於在存檔後釋放陣列,當用戶離開應用程序(它將被掛起)並且隨後返回(應用程序剛剛重新激活,未重新啓動)時,將失敗。在這種情況下,您釋放數組的事實將導致您的應用程序崩潰。

+0

我測試的方式是從iphone主屏幕關閉後臺進程。我覺得那個電話確實接通了? – Djmorrsee 2011-04-02 21:12:03

+0

不,它沒有。它只是殺死了這個過程。你可以用調試器輕鬆測試。 – 2011-04-02 21:15:54

相關問題