我正在创建一个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存储的简单方法.
创建包含字典数组的属性列表.使每个字典的键对应于托管对象的键.
alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png
然后,在应用程序第一次启动时调用此方法:
- (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]; }