4

我整天都在使用这里的答案来解决这个问题,但我找不到适合我的解决方案,所以我想我会寻求帮助:

我有一组从实体中提取的对象。

我要做的就是将对象写入文件。

到目前为止,我想出的是:

    NSLog(@" Exported Records: %i", [exportArray count]); 
    // the count here is 4 records.
    //Each record has about 8 elements. 
//I'm just trying to get this working with the first two elements right now

        NSString *writeString = nil;
        NSError *error = nil;
        int i = 0;
        NSString *key = nil;
        NSString *tempString = nil;
        for (i=0; i<[exportArray count]; i++)
        {
            tempString = [tempString stringByAppendingString: @" \n "];

            for (int j=0; j<3; j++)
            {
                if (j == 0)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"title"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"title"]];
                }
                if (j == 1)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"username"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"username"]];
                }
                writeString = [NSString stringWithFormat:tempString, key];
            }
        }

        // Write to the file
        [writeString writeToFile:dataFile atomically:YES
                    encoding:NSUTF8StringEncoding error:&error];
        if (error)
        {
            NSLog(@"%@", error);
        }

现在,我得到了最后一项,所以我覆盖了字符串。但是,必须有更好的方法来实现这一点。如果这里有另一个答案与我的问题相匹配,请告诉我,或者请发表一些想法。

更新

当我记录 exportArray 时,我得到了这个:

"<ItemEntity: 0x1ddf6560> (entity: ItemEntity; id: 0x1ddf46d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6800> (entity: ItemEntity; id: 0x1ddf46e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2051> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6860> (entity: ItemEntity; id: 0x1ddf45d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p3075> ; data: <fault>)",
    "<ItemEntity: 0x1ddf68c0> (entity: ItemEntity; id: 0x1ddf45e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p5124> ; data: <fault>)"
)

当我记录实际值时:

NSLog(@" Exported titles: %@", [exportArray valueForKey:@"title"]);
NSLog(@" Exported usernames: %@", [exportArray valueForKey:@"username"]);

我得到正确的结果。我只是不知道如何将这些和其他属性联系在一起..

  Exported titles: (
    1,
    2,
    4,
    6
)
  Exported usernames: (
    ellis,
    david,
    bea,
    ian
)
4

5 回答 5

8

如果您NSDictionaries的数组中只有一个,您可以使用writeToFile:atomically:它将以.plist格式保存文件(这比 CSV 更容易阅读)。

查看NSArray 的 Apple Docs和plists上的一篇好文章。

所以你最终会拥有:

[exportArray writeToFile:fileName atomically:YES];

编辑:您不能将核心数据对象保存到文件中。因此,您要做的是仅使用所需数据创建一个临时数组,然后将其写入文件。

NSMutableArray* arrayToSave = [NSMutableArray arrayWithCapacity:exportArray.count];
[exportArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary* exportDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                [obj objectForKey:@"username"], @"username",
                                [obj objectForKey:@"title"], @"title", nil];
    [arrayToSave addObject:exportDict];
}];

[arrayToSave writeToFile:fileName atomically:YES];
于 2013-01-15T00:04:26.230 回答
7

用这个,

[exportArray writeToFile:dataFile atomically:YES];

NSArray有办法writeToFile:做到这一点。在此处查看文档。如果数组中没有自定义对象,这可以正常工作。

如果您只想保存标题或用户名(即使它在数组中有自定义对象),您可以这样做:

NSArray *array1 = [exportArray valueForKey:@"title"];
[array1 writeToFile:dataFile atomically:YES];

或者

NSArray *array2 = [exportArray valueForKey:@"username"];
[array2 writeToFile:dataFile atomically:YES];
于 2013-01-14T23:59:06.847 回答
4
[exportArray writeToFile: dataFile atomically:YES];

创建并写入.plist文件格式。

除非数组中有 plist 不支持的对象。

支持的对象是:属性列表对象`NSStringNSNumberNSDateNSData和。NSArrayNSDictionary

UItextField并且UItextView不受 plist 格式的支持,因此这将不起作用。如果您要保存的只是其中的文本,请将文本放入数组中。

于 2013-01-15T00:05:12.733 回答
2

试试这个:


    NSMutableString *string = [NSMutableString string];
    for (NSDictionary* dict in exportArray) {
        for (NSString* key in [dict allKeys]) {
            NSObject* value = [dict objectForKey:key];
            [string appendFormat:@"%@ = %@\n", key, value];
        }
    }

    // Write to the file
    NSError* error = nil;
    [string writeToFile:dataFile atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error)
        NSLog(@"%@", error);
于 2013-01-15T00:06:44.253 回答
2

我会考虑先将其转换为 NSData,然后将其保存为二进制 plist 而不是人类可读的 plist,因为二进制 plist 的读取速度要快得多(我相信是 2-3 倍,但我不记得它是在哪个 WWDC 视频中解释的)。为此,您首先需要将 NSArray 转换为 NSData 对象:

(来源:Rob Napier 对此 SO 问题的回答

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
// "Note that all the objects in array must conform to the NSCoding protocol."

NSString *error;
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array
format:NSPropertyListBinaryFormat_v1_0 options:NULL error:&error];

然后您可以使用以下命令将 NSData 写入文件:

[data writeToFile:path atomically:YorN];

要读回它,然后使用:

NSData *rawdata = [[NSData alloc] initWithContentsOfFile:/*file*/];
NSData *arrayData = [NSPropertyListSerialization propertyListWithData:rawdata
options:NULL format:NULL error:&error];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];

您只需要对非常大的 .plist 文件使用二进制进程,但了解它很方便。

于 2013-01-15T00:31:18.840 回答