iOS:如何使用下载的CSV填充CoreData

我一直在做一个应用程序,用户每天input存储在核心数据中的数据(两个属性是NSNumber ,另一个是NSDate ),我想通过允许用户从外部文件(如csv或其他任何其他文件)导入数据支持格式通过button点击。 有关如何有效地进行这项工作的任何build议?

谢谢。

编辑:只需将csv文件的屏幕截图以及csvparsing器的输出添加为NSArray即可。 基本上需要单独获取属性并将其存储在核心数据上。

– input文件为csv:

在这里输入图像说明

– 示例csv分析器输出(NSarray):

在这里输入图像说明

我最近需要做类似的事情。

我的项目团队的几个成员想要把我们的应用原型展示给潜在的客户,但是想向每个客户展示不同的数据。 我们通过允许我们的项目团队成员在与客户会面之前创build自己的testing数据来解决这个问题。

我通过创build示例.csv文件并将其分发给项目组中的其他人员来实现此目的。 他们用自己的testing数据填充它,并使用iTunes文件共享将.csvtesting数据文件放到设备上。

在加载时,应用程序将扫描其Documents目录中的testing数据文件。 如果存在,则parsing.csv文件并保存到数据库。

对于CSVparsing,我使用了Dave DeLong的CHCSVParser: https : //github.com/davedelong/CHCSVParser

为您的应用程序设置iTunes文件共享提供了大量的帮助。 如果你需要的话,快速谷歌发现这个教程( http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app )应该帮助你。

编辑 – 添加有关将.csv中的数据存储在Core Data中的帮助

你在你原来的文章中说过,你存储了一个NSNumber和NSDate。 以此为起点,您可能有以下forms的.csv文件:

 +----------------+--------------+ + NSNumberColumn | NSDateColumn | +----------------+--------------+ + 1 | 2013-05-15 | + 2 | 2013-06-15 | + 3 | 2013-07-15 | +----------------+--------------+ 

假设CSVparsing器的输出是NSArray的NSArray,那么可以按如下方式创buildCore Data对象:

我会为列号创build一些macros:

 #define NSNumberColumn 0 #define NSDateColumn 1 

然后遍历.csv文件中的行:

 NSArray *rows = [NSArray arrayWithContentsOfCSVFile:pathToFile]; //CHCSVParser specific parsing method for (NSArray *row in rows) { NSString *numberString = [parsedCsvRow objectAtIndex:NSNumberColumn]; NSString *dateString = [parsedCsvRow objectAtIndex:NSDateColumn]; NSNumber *number = // parse numberString to an NSNumber. Plenty of other posts on achieving this. NSDate *date = // parse NSDate from dateString. Plenty of other posts on achieving this. NSManagedObjectContext *context = [self managedObjectContext]; NSManagedObject *myCoreDataObject = [NSEntityDescription insertNewObjectForEntityForName:@"MyCoreDataObject" inManagedObjectContext:context]; [myCoreDataObject setValue:number forKey:@"NSNumberColumn"]; [myCoreDataObject setValue:date forKey:@"NSDateColumn"]; NSError *error; if (![context save:&error]) { NSLog(@"%@", [error localizedDescription]); } } 

注:为简洁起见,inputvalidation和空检查已被忽略。 我也冒昧组成你的NSManagedObject属性名称,这将需要更新。 上面的代码应该分成更合适的类结构。

我现在不在Mac上,所以不幸的是我不能检查这是否工作。

希望有所帮助。

尝试使用plist或json,它们已经在iOS上支持,而不是在CSV上。 CSV将需要第三方分析器。 使用json或者plist,你只需要遍历集合的元素来创build持久存储。 如果你只有CSV,你可以使用不同的免费工具进行中间转换,你可以在互联网上免费find,然后添加到你的包或发布到您的网站。

这就是当你已经parsing了你的CSV文件并且可以在Objective-C中使用数据的时候你所要做的。

  1. 为导入创build一个单独的上下文。 您不知道数据有多大,因此您可能不想在导入时阻止其中一个现有上下文。

  2. 遍历parsing数据中的条目并插入从每个条目configuration的新托pipe对象。

  3. 每个200,500或1000个条目(对于每个人都不同,您需要testing最适合您的条目),保存上下文,并在需要时发布批量导入的通知。

  4. 为了减less内存,重置上下文,并忘记在此导入上下文中创build的所有对象。

  5. 循环结束后,不要忘记保存上一次。

现在你如何将数据带入另一个环境,比如说UI环境?

这取决于你组织你的核心数据堆栈的方式。 例如,可以将导入上下文configuration为UI上下文的子项。 在这种情况下,每次保存到导入上下文之后,这些更改将被推送到UI上下文(并且不要忘记保存UI上下文,以便进一步推送更改)。

但是这不是最有效的方法,因为在主线程上下文的UI上下文被包含在导入中,并且在阻塞它的UI线程上完成额外的工作。 我build议创build导入上下文而不是作为一个孩子,但直接连接到持久性商店协调员。 在这种情况下,要对UI上下文进行更改,您需要在每次保存之后调用mergeChangesFromContextDidSaveNotification:方法,或者在每次保存之后在UI上下文中重新mergeChangesFromContextDidSaveNotification: 。 后者在UI上下文中更容易,尤其是在NSFetchedResultsController上,如果使用它,因为它不需要逐一重播对更新对象的更改。