2011-09-05 87 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

相关问题