如何在核心数据实体中手动添加数据

时间:2010-04-13 13:10:25

标签: iphone core-data

我第一次在Core Data工作。 我刚刚为该实体创建了EntityAttributes。我想添加一些行作为数据(你可以说我想在表中添加数据)。

在我使用Sqlite之前,我会使用Terminal添加数据。但是在Core Data这里,我无法找到手动添加数据的方法。我只想将数据添加到Context并将其显示在UITableView中。我已经阅读了Core Data的文档,但它没有解释如何手动添加数据,尽管它解释了我如何以编程方式添加它。但我不需要以编程方式执行此操作。我想手动完成。

4 个答案:

答案 0 :(得分:7)

我对CoreData也很新,并且正在为此寻找解决方案。我很高兴在这里找到一篇文章:http://iphoneinaction.manning.com/iphone_in_action/core-data关于如何获取CSV文件并导入数据(查找核心数据,第5部分:预填充数据)。

以下是我使用的代码:

-(void)addData
{
  NSString *paths = [[NSBundle mainBundle] resourcePath];
  NSString *bundlePath = [paths stringByAppendingPathComponent:@"file.csv"];
  NSString *dataFile = [[NSString alloc] initWithContentsOfFile:bundlePath];
  NSArray *dataRows = [dataFile componentsSeparatedByString:@"\n"];
  [dataFile release];
  MyEntity *myMO;

for (int i = 0 ; i < [dataRows count] ; i++) { NSLog(@"Added: %d",i); myMO = (MyEntity *)[NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:[self managedObjectContext]]; [myMO setAttrib1:[NSNumber numberWithInt:i+1]]; [myMO setAttrib2:[dataRows objectAtIndex:i]]; [self saveAction]; } }

我只有一列,所以我不需要所有代码。这是文章中的代码。如果没有意义,请尝试查看文章。

CSV文件:

1,A$20,Australian Dollars,20,aussie-20.png
2,R$20,Brazilian Reals,20,brasil-20.png

代码:

- (void)setupCards {
 NSString *paths = [[NSBundle mainBundle] resourcePath];
 NSString *bundlePath = [paths stringByAppendingPathComponent:@"cards.csv"];
 NSString *dataFile = [[NSString alloc] initWithContentsOfFile:bundlePath];
 NSArray *dataRows = [dataFile componentsSeparatedByString:@"\n"];
 [dataFile release];
 Card *card;
 for (int i = 0 ; i < [dataRows count] ; i++)
 {
  NSArray *dataElements = [[dataRows objectAtIndex:i] componentsSeparatedByString:@","];
  if ([dataElements count] >= 4)
  {
   card = (Card *)[NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:[self managedObjectContext]];
   [card setId:[NSNumber numberWithInt:i]];
   [card setName:[dataElements objectAtIndex:1]];
   [card setType:[dataElements objectAtIndex:2]];
   [card setWorth:[NSNumber numberWithInt:
   [[dataElements objectAtIndex:3] intValue]]];
   [card setImages:[NSSet setWithObject:
   [self setupCardPic:[dataElements objectAtIndex:4]]]];
   [self saveAction:self];
  }
 }
}


回答您的评论:no i want to add data manually, similar to what we do in sqlite through terminal or in sql server using sql query。下载FireFox并搜索名为SQLITE MANAGER的加载项工具。它允许您打开任何SQLITE数据库,甚至是您的应用程序创建的数据库。 SQLITE MANAGER是SQLITE数据库的GUI,类似于MS SQL Server Management Studio,功能较少。您可以通过它查看,编辑和添加数据,如果您打算通过Core Data使用数据库,我建议您通过此工具添加数据。您甚至可以将此工具用于您通常通过终端创建的SQLITE数据库(这是我在需要时执行的操作,以及何时不需要使用MS SQL)。

答案 1 :(得分:3)

您可以将数据添加到没有关联的自定义NSManagedObject子类的实体,如下所示:

NSManagedObject *mo = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntityName"
inManagedObjectContext:aManagedObjectContext];
[mo setValue:aValue forKey:@"aKeyName"];
id aValue=[mo valueForKey:@"aKeyName"];

核心数据不是表数据库。它是一个对象图管理系统。因此,您可以通过更改对象的属性来处理Core Data中的数据。

在上面的例子中,我正在更改mo实例所持有的值,这是一个通用的NSManagedObject。因为mo是一个通用的NSManagedObject,所以我使用setValue:forKey将值存储在NSManagedObject的关联存储中。键名由您在数据建模器中创建的实体设置。

更常见的是,您将创建一个专用的NSManagedObject子类,其属性是实体的属性和关系。在这种情况下,上面的代码看起来像:

MyManagedObjectSubclass *myMO = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity"
inManagedObjectContext:aManagedObjectContext];
myMo.attributeName=aValue;
id anotherValue=myMo.attributeName;

试图用SQL术语来思考核心数据只会导致悲伤。核心数据不像SQL那样工作。它就像一组高度互连的自定义对象。您需要在对象中考虑核心数据,而不是表格。

答案 2 :(得分:0)

您和应用用户的最佳解决方案可能是使用xml数据。您可以轻松地从Web服务请求XML并将其存储在您的应用程序中,而无需始终从Web上实时阅读。当然,如果您的数据量很大,这可能是一个问题,但您也可以将数据请求拆分为较小的块,只存储您提取的内容以供重用,也许还有离线模式。

BjörnSållarp的这篇教程应该会有很多帮助。 http://blog.sallarp.com/iphone-core-data-uitableview-drill-down/

答案 3 :(得分:0)

我刚刚创建了NSManagedObjectContext,因此在app文件夹中创建了一个SQLite文件。

然后我可以将SQLite文件填充为正常文件,CoreData可以读出预填充数据。