我正在创建一个 iPhone 应用程序,并且想知道 Core Data 是否比 SQLite 数据库更适合只读数据。感觉 SQLite DB 是更好的选择,对吗?我什至可以预先填充核心数据存储吗?
基本上,我需要 3 个表,每个表都有一堆(最多 3000 个)实体。然后,我想在 TableViews 中列出数据,对其进行搜索或加载其他内容。
在这种情况下,我应该或可以使用 Core Data 吗?
如果您将在表格视图中显示您的只读数据,那么仅由于 NSFetchedResultsController 而使用 Core Data 比使用 SQLite 具有显着优势。这个便利类使得在表格视图中显示数据库元素变得非常容易,并且它可以为您处理批量获取。批量提取使您可以立即在屏幕上加载您需要的信息,从而显着改善除最小数据集之外的所有数据集的加载时间和内存使用情况。
出于这个原因,我将 Core Data 用于我在应用程序包中提供的只读信息,同时我可以与存储在用户应用程序数据中的可写数据库共享数据模型。我的建议是使用 Core Data,除非您绝对需要针对 iPhone OS 2.x 设备。
这是使用 plist 预加载 Core Data 存储的简单方法。
创建一个包含字典数组的属性列表。使每个字典的键对应于您的托管对象的键。
然后,在应用程序第一次启动时调用此方法:
- (void)loadDataFromPropertyList {
NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"];
NSArray *items = [NSArray arrayWithContentsOfFile:path];
NSManagedObjectContext *ctx = self.managedObjectContext;
for (NSDictionary *dict in items) {
NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx];
[m setValuesForKeysWithDictionary:dict];
}
NSError *err = nil;
[ctx save:&err];
if (err != nil) {
NSLog(@"error saving managed object context: %@", err);
}
}
通过在实现中包含以下代码来调用loadDataFromPropertyList
应用程序第一次启动application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"])
{
[defaults setObject:[NSDate date] forKey:@"firstRun"];
[[NSUserDefaults standardUserDefaults] synchronize];
[self loadDataFromPropertyList];
}
你绝对可以在你的应用程序中提供一个预填充的核心数据存储,就像你可以提供一个预填充的 SQLite 数据库,或者一个包含所有数据的大 plist(尽管这听起来不适合这种情况),或者其他什么.
Core Data 很好,因为它都是原生的 Cocoa,它处理所有从 DB 到原生对象的加载,它被无情地优化,等等。但是那里也有很多代码可以做一些你不关心的事情:处理修订、保存更改、撤消和重做支持等。因此,无论哪种方式,都没有一个明显正确的答案。
很大程度上取决于您对 Core Data 和替代方案的舒适程度。您是否乐于使用 SQLite API(或众多Cocoa 包装器之一)来获取数据?如果是这样,那可能会更简单。如果让 Core Data 为你做 ORM 会是一个巨大的胜利,那就去吧。另一方面,使用 Core Data 的复杂查询使用谓词 API,这可能比使用带有 SQLite 的裸 SQL 更复杂。那种事。
根据它们的关系,您最好从 plist 中读取只读数据。Plist 很容易加载/保存(它们变成 NSDictionaries)并且可能更容易编辑
Core Data 使用 SQLite(以及其他选项),因此您的问题有些缺陷。