CoreData的简单使用

来源:互联网 发布:月薪12000的北京程序员 编辑:程序博客网 时间:2024/05/04 15:37

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


详细使用地址

CoreData详细使用上中下篇





0 0
原创粉丝点击