我第一次在Core Data
工作。
我刚刚为该实体创建了Entity
和Attributes
。我想添加一些行作为数据(你可以说我想在表中添加数据)。
在我使用Sqlite
之前,我会使用Terminal
添加数据。但是在Core Data
这里,我无法找到手动添加数据的方法。我只想将数据添加到Context
并将其显示在UITableView
中。我已经阅读了Core Data
的文档,但它没有解释如何手动添加数据,尽管它解释了我如何以编程方式添加它。但我不需要以编程方式执行此操作。我想手动完成。
答案 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
可以读出预填充数据。