【问题标题】:Why doesn't my NSMutableArray write to plist?为什么我的 NSMutableArray 不写入 plist?
【发布时间】:2011-09-05 04:49:50
【问题描述】:

我有以下代码块:

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?

附加说明: 下面是 mergeSymbolsArray 包含的字典示例:

  {
    "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:atomically 方法失败是因为无法写入?

【问题讨论】:

  • +(void)writeObjectToPList:(id)myData 。尝试将 (id) 更改为 NSMutableArray....type
  • @booleanboy 我把它改成了 NSMutableArray,不幸的是结果一样
  • 在将数据添加到 mergeSymbolsArray 后,使用 NSLog 检查数据是否真的开始存储......并尝试使用 alloc 而不是 autorelease 数组......
  • writeToFile 实际上返回 NO。我改为分配而不是自动释放,结果相同。为什么 writeToFile 返回 NO?
  • 尝试以原子方式设置为 NO

标签: iphone objective-c cocoa-touch nsmutablearray plist


【解决方案1】:

确保您保留在数组中的所有对象都是属性列表对象(NSString、NSData、NSArray 或 NSDictionary)。

【讨论】:

    【解决方案2】:

    失败,因为 dta 包含扇区 = "",其值被解释为 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];
    }
    

    【讨论】:

    • 非常感谢它确实解决了我的问题 :) 我错过了 NSKeyedArchiver,我想我很快就会阅读更多关于它的信息:)再次感谢您的帮助 :)
    【解决方案3】:

    请检查[myData writeToFile:path atomically:YES];的返回值。如果为否,则在写入时发生了一些错误。尝试分配初始化 NSMutableArray 而不是创建自动释放的。

    【讨论】:

    • 我检查了 writeToFile:atomically 是否正确返回。不幸的是,它对我的​​情况返回 NO。如何进一步诊断?
    • @Sheehan 当 writeToFile: 被调用时 path 的值是多少?目录存在吗?
    • 目录确实存在。 path 的值为/Users/syalam/Library/Application Support/iPhone Simulator/4.3.2/Applications/2C2B2FDF-B376-43FA-AA95-49921B3DC3B4/Documents/mobile-watchlist.plist
    【解决方案4】:

    尝试在文件名中添加正斜杠,即:

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

    【讨论】:

    • stringByAppendingPathComponent 自动完成
    • 不幸的是,这并不能解决我的问题。还是不能写plist
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多