2011-09-05 86 views
0

我有下面的代碼塊:爲什麼我的NSMutableArray沒有寫入plist?

NSMutableArray* mergedSymbolsArray = [NSMutableArray array]; 
        for (NSDictionary* aSymbol in localSet) { 

         NSLog(@"Symbol:%@",[aSymbol valueForKey:@"symbol"]); 
         [mergedSymbolsArray addObject:aSymbol]; 

        } 

        [Utils writeObjectToPList:mergedSymbolsArray]; 
        tickers = [Utils getDataFromPList]; 

這裏是我的代碼來讀取/寫入的plist:

+ (void)writeObjectToPList:(id)myData { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"]; 
    [myData writeToFile:path atomically:YES]; 
} 

+(NSMutableArray*)getDataFromPList 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mobile-watchlist.plist"]; 

    NSMutableArray* myArray = [[NSMutableArray alloc] initWithContentsOfFile:path]; 
    NSLog(@"READING -- PList Data Count: %d", [myArray count]); 
    return [[NSMutableArray alloc] initWithContentsOfFile:path]; 
} 

出於某種原因mergedSymbolsArray不會寫入一個plist中。我不知道爲什麼?

我能夠寫出下列成的plist:

[tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"GOOG", @"symbol", @"2044", @"id", nil]]; 
     [tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"AAPL", @"symbol", @"686", @"id", nil]]; 
     [tickers addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"YHOO", @"symbol", @"4177", @"id", nil]]; 

     [Utils writeObjectToPList:tickers]; 

爲什麼不寫代碼的第一個塊到的plist?

其他注意事項: 這裏是mergedSymbolsArray包含字典的例子:

{ 
    "charts_count" = 2; 
    "created_at" = "2010-04-12T16:37:32Z"; 
    exchange = NASDAQ; 
    "followers_count" = 259; 
    id = 8404; 
    industry = "<null>"; 
    "messages_count" = 1436; 
    ric = "GRPN.O"; 
    sector = "<null>"; 
    symbol = GRPN; 
    title = Groupon; 
    "updated_at" = "2011-09-05T04:17:56Z"; 
} 

我猜將writeToFile:原子的方法失敗,因爲不能寫?

+0

+(void)writeObjectToPList:(id)myData。嘗試更改(id)到NSMutableArray ....類型 – booleanBoy

+0

@booleanboy我將其更改爲NSMutableArray,不幸的是相同的結果 –

+0

將數據添加到mergedSymbolsArray後,使用NSLog檢查以查找數據是否確實正在存儲....並且還嘗試使用alloc而不是自動釋放數組... – booleanBoy

回答

4

確保所有你保持數組中的對象是屬性列表對象(的NSString,NSData的,NSArray的,或者NSDictionary的)。

0

請檢查退貨價格[myData writeToFile:path atomically:YES];。如果是NO,寫入時會發生一些錯誤。嘗試alloc-init NSMutableArray,而不是創建一個自動發佈的。

+0

我檢查了是否writeToFile:原子返回正確。不幸的是,它對我的​​情況返回NO。我如何進一步診斷? –

+0

@Sheehan當writeToFile:被調用時,路徑的值是什麼?目錄是否存在? – ThomasW

+0

該目錄確實存在。路徑的值是'/ Users/syalam/Library/Application Support/iPhone Simulator/4.3.2/Applications/2C2B2FDF-B376-43FA-AA95-49921B3DC3B4/Documents/mobile-watchlist.plist' –

0

嘗試添加斜線到您的文件名即:

NSString *path = [documentsDirectory stringByAppendingString:@"/mobile-watchlist.plist"]; 
+1

'stringByAppendingPathComponent'自動執行 – Dani

+0

不幸的是,這並沒有解決我的問題。仍然不能寫plist –

2

它失敗了,因爲dta包含扇區=「< null>」,其值被解釋爲NSNull,不能寫入plist。

我在序列化之前將NSArray或NSDictionary轉換爲NSData。以下是用於序列化和反序列化的nsarray類別。這個舒適的處理一些數據是nsnull

-(BOOL)writeToPlistFile:(NSString*)filename{ 
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES]; 
    return didWriteSuccessfull; 
} 

+(NSArray*)readFromPlistFile:(NSString*)filename{ 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    NSData * data = [NSData dataWithContentsOfFile:path]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 
+0

非常感謝,它真的解決了我的問題:) 我錯過了NSKeyedArchiver,我想我會閱讀更多關於它很快isA :) 再次感謝您的幫助:) – Abo3atef

相關問題