CoreData的简单使用

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值