用于复杂报告的CoreData对象或SQL语句?

时间:2012-09-27 10:42:40

标签: iphone objective-c ios sqlite core-data

我的iOS应用程序有一个从PostgreSQL数据库继承的模型。该应用程序具有报告功能,有可能在将来变得更加复杂。此外,可能需要将本地应用程序数据与PostgreSQL数据库服务器同步。

到目前为止,我已经使用CoreData对象来读取,写入和删除数据。我一直在翻译SQL查询以使用CoreData语言,但发现它们中的一些不必要地繁琐,例如:

select sum(amount), date from db.table group by date;

这只是一个示例,应用程序将来可能需要更复杂的报告查询。因此,我正在考虑从CoreData切换到直接查询SQLite(我可以使用已编写的查询来查询PostgreSQL DB)。

我的问题是:

  • 考虑到报告是应用程序的核心功能(即需要非平凡的SELECT查询),继续使用CoreData而不是SQL查询是否值得?
  • 使用相同存储的SQL(对于复杂的SELECT查询)和CoreData(对于应用程序的其余部分)是否可行?

2 个答案:

答案 0 :(得分:1)

一旦你理解了语法,我就会快速而简单地转移到CoreData。最大的区别是你用这样的东西替换sql语句:

 // Retrieve the entity from the local store -- much like a table in a database
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"AppSettings" inManagedObjectContext:managedObjectContext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];


// Set the predicate -- much like a WHERE statement in a SQL database
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"version == %@", @"Default"];
[request setPredicate:predicate];


// Set the sorting -- mandatory, even if you're fetching a single record/object

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"version" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
sortDescriptors = nil;
sortDescriptor = nil;

// Request the data -- NOTE, this assumes only one match, that 
// yourIdentifyingQualifier is unique. It just grabs the first object in the array. 
AppSettings *appSettings1 =[[managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:0];

request = nil;


//Update the object
appSettings1.backGroundImage = [NSNumber numberWithInt: backGroundGraphics.selectedSegmentIndex];

希望这有助于在开发人员部分下的MAC应用商店中也有工具,真正帮助核心数据编辑器一直使用。

您可以直接使用SQL,但数据存储结构在核心数据字段中看起来有点滑稽。

答案 1 :(得分:1)

我出于同样的原因删除了核心数据,我有一些非常复杂的查询,并且在转换为核心数据使用时,这是一个太大的痛苦。坚持使用纯SQLLite并手动编写SQL是我认为的方法。或者,您可以将FMDB用作SQLlite https://github.com/ccgus/fmdb

的包装器