1.使用Core Data 的优点:(摘自:点击打开链接)
Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互。Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需任何SQL知识就能操作他们。
Core Data位于MVC设计模式中的模型层,一般需要在设备上存储结构化数据时,考虑使用SQLite或是序列化等方法,而Core Data是这两种方法的混合体,并增加了一些功能,提供了SQL强大威力,但是用起来又和序列化一样简单。Core Data能将应用程序中的对象直接保存到数据库中,无需进行复杂的查询,也无需确保对象的属性名和数据库字段名对应,这一切都由Core Data完成。
Core Data的核心——托管对象
托管对象是要存储到数据库中的对象的一种表示,可以看成是SQL记录,它通常包含一些字段,这些字段与应用程序中要存储的对象的属性进行匹配,创建托管对象后,必须将气托管到托管对象上下文中,然后才可以存储到数据库中。
托管对象上下文:
托管对象上下文包含所有的托管对象,这些托管对象已经为提交给数据库准备就绪,在托管对象上下文中,可以添加、修改和删除托管对象,这一层相当于应用程序和数据库之间的缓冲区。
托管对象表:
托管对象表描述了数据库的架构(schema),供托管对象上下文与数据库交互时使用。托管对象表包含一些列实体描述,每个实体都描述了一个数据库表,用于将托管对象映射到数据库条目。
2.具体使用如下:
1.新建CoreDataDemo项目。
2.新建DataModel
选择Core Data temple ,选择 Data Model->Next->Create.
添加Attributes
3.新建 NSManagedObject subclass.
选择Core Data temple ,选择NSManagedObject subclass ->Next。
4.配置
#pragma mark- NSManagedObjectContext Handle
- (NSManagedObjectContext *)managedObjectContext
{
if (_objectContext != nil) {
return _objectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_objectContext = [[NSManagedObjectContext alloc] init];
[_objectContext setPersistentStoreCoordinator:coordinator];
}
return _objectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (_objectModel != nil) {
return _objectModel;
}
//从本地所有xcdatamodel文件中获得这个CoreData的数据模板
_objectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _objectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_coordinator != nil) {
return _coordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"RandomEvent.sqlite"]]; //数据库名为RandomEvent.sqlite
NSError *error;
_coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
// handle db upgrade
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
//使用sqlite 类型
if (![_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSAssert(0, @"persistentStoreCoordinator init failed!");
}
return _coordinator;
}
- (NSString *)applicationDocumentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"basePath:%@",basePath);
return basePath;
}
5.数据操作。
1.add:
-(IBAction) add:(id)sender{
RandomEvent *event = [NSEntityDescription insertNewObjectForEntityForName:@"RandomEvent" inManagedObjectContext:_objectContext];
event.randomNumber = [NSNumber numberWithFloat:arc4random()%100];
event.createDate = [NSDate date];
[self saveContext];
[self refreshEventList];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:(_dataSource.count -1) inSection:0];
[self.eventTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
2.更新数据
#pragma mark- Data
-(BOOL)saveContext{
NSError *error = nil;
if (![_objectContext save:&error]) {
//handle error.
NSLog(@"error:%@",error.localizedDescription);
return NO;
}
return YES;
}
-(void)fetchEvents{
NSEntityDescription *entityDesctiption = [NSEntityDescription entityForName:@"RandomEvent" inManagedObjectContext:_objectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entityDesctiption];
//根据字段对数据进行排序
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error = nil;
if (_dataSource.count > 0) {
[_dataSource removeAllObjects];
}
[_dataSource addObjectsFromArray: [_objectContext executeFetchRequest:fetchRequest error:&error]];
if (nil == _dataSource) {
NSLog(@"Error: %@", [error localizedDescription]);
}
}
6.填充数据,刷新UI
#pragma mark - UITableViewDataSource
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _dataSource.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellID = @"RandomEventCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
}
RandomEvent *randomEvent = [_dataSource objectAtIndex:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%d",[randomEvent.randomNumber intValue]];
NSDate *date = randomEvent.createDate;
NSString *time = [self dateTimeWithDate:date];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",time];
return cell;
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
NSUInteger row = indexPath.row;
if (row < [_dataSource count]) {
[_objectContext deleteObject:[_dataSource objectAtIndex:row]];
[self saveContext];
[self refreshEventList];
}
}
#pragma mark- UI
-(void)refreshEventList{
[self fetchEvents];
[self.eventTableView reloadData];
}
主要代码如上。
Demo 地址: CoreDataDemo
详细使用地址