我认为这很简单,但我是Objective-C,IOS和核心数据的新手。
我有一个名为EnquiryStore的核心数据实体,它包含各种属性“名称”,“地址”,“查询”等。
我可以很好地获取结果,但我很难理解结果的存储方式!这使得我很难完成我的程序的下一部分,即使用Dave DeLong的CHCSVWriter将数据导出为CSV。我明白要使用
[array writeToCSVFile:outputCSVFile atomically: NO];
它会接受一个阵列数组,这是Core Data给我的吗?因为我无法使用该方法。
我可以用
[myCSVWriter writeField: ...];
[myCSVWriter writeLine];
但这似乎很长,因为我必须从Core Data的每个属性构建字符串。
答案 0 :(得分:3)
您是唯一知道NSManagedObject外观的人,它可能具有无法放入csv文件的关系。它可能具有二进制数据,这在csv文件中不是很有用。或者它可能具有您不想导出的属性。而且你必须决定你希望你的csv导出的顺序。
很容易创建NSArray的NSArray(即要导出的NSManagedObjects列表)(即该对象的导出属性列表)。只需枚举所有NSManagedObject并使用要导出的值填充数组。
您可以使用以下内容:
NSArray *objectsForExport = ... /* get it through a fetch request... helper function... whatever */
NSArray *exportKeys = [NSArray arrayWithObjects:@"foo", @"bar", @"name", @"city", @"address", nil];
NSMutableArray *csvObjects = [NSMutableArray arrayWithCapacity:[objectsForExport count]];
for (NSManagedObject *object in objectsForExport) {
NSMutableArray *anObjectArray = [NSMutableArray arrayWithCapacity:[exportKeys count]];
for (NSString *key in exportKeys) {
id value = [object valueForKey:key];
if (!value) {
value = @"";
}
[anObjectArray addObject:[value description]];
}
[csvObjects addObject:anObjectArray];
}
你有你的数组数组。
我相信有一种方法可以返回NSArray值,如果你传递一个NSArray键,但我找不到它,我记不起它的名字,甚至不记得它属于哪个类。
答案 1 :(得分:2)
虽然“writeField:”方法可能看起来很长,但它也是最具描述性的:
CHCSVWriter *writer = [[CHCSVWriter alloc] initWithCSVFile:@"/Path/To/CSV/File.csv" atomically:NO];
NSArray *myArrayOfManagedObjects = ...;
for (NSManagedObject *obj in myArrayOfManagedObjects) {
[writer writeField:[obj valueForKey:@"attribute1"]];
[writer writeField:[obj valueForKey:@"attribute2"]];
[writer writeField:[obj valueForKey:@"attribute3"]];
[writer writeField:[obj valueForKey:@"attribute4"]];
[writer writeLine];
}
[writer closeFile];
[writer release];
请注意,writeField:
需要id
作为参数,而不是NSString*
。您可以将任何对象传递给它,CHCSVWriter
将抓取对象的-description
并将其写出来。 (这甚至发生在传入的NSString
个对象中)这是因为必须对值进行一些修改(例如确定字段是否需要引用)。