数据存储之---CoreData

详情参考:http://www.cnblogs.com/mjios/archive/2013/02/26/2932999.html#label2

#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Person.h"
#import "Card.h"

@interface ViewController ()

@property (nonatomic,strong) NSManagedObjectContext       *managedObjectContext;
@property (nonatomic,strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic,strong) NSManagedObjectModel         *managedObjectModel;


@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    [self save];
}

-(void)save
{
    Person * person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    person.age = @16;
    person.name = @"hi";
    
    Card * card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:self.managedObjectContext];
    card.no = @430424;
    person.card = card;
    
    NSError * error = nil;
    [self.managedObjectContext save:&error];
    if (error) {
        NSLog(@"inser error");
    }
}

-(IBAction)buttonClick:(id)sender
{
    [self read];
}

-(void)read
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    fetchRequest.entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext];
    NSSortDescriptor * sortDes = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
    fetchRequest.sortDescriptors = @[sortDes];
    
    NSError *error = nil;
    NSArray *objs = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    if (error) {
        [NSException raise:@"查询错误" format:@"%@", [error localizedDescription]];
    }
    // 遍历数据
    for (NSManagedObject *obj in objs) {
        NSLog(@"name=%@", [obj valueForKey:@"name"]);
        Person * person = (Person*)obj;
         NSLog(@"card=%d", [[person.card valueForKey:@"no"] integerValue]);
    }
}

/**
 *获取上下文
 *定义 协调者 coordinator
 */
-(NSManagedObjectContext*)managedObjectContext
{
    if (_managedObjectContext == nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc]init];
        _managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
        
    }
    return _managedObjectContext;
}

/**
 *协调 1.数据存储方式 sqlite  2.存储路径 3.加载对象模型
 */
-(NSPersistentStoreCoordinator*)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managedObjectModel];
    NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSURL * url = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:@"person.data"]];
    NSError * error;
    NSPersistentStore * store = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
    if (store == nil) {
        [NSException raise:@"数据库异常" format:@"%@",[error localizedDescription]];
    }
    return _persistentStoreCoordinator;
}

-(NSManagedObjectModel*)managedObjectModel
{
    if (_managedObjectModel == nil ) {
        _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    }
    return _managedObjectModel;
}

2.利用  NSFetchedResultsController 为tableview提供数据源

#pragma mark - UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [[_fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [[[_fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

- (void)configureCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath*)indexPath{
    
    //Locate Object for given row
    NSManagedObject *managedObject = [_fetchedResultsController objectAtIndexPath:indexPath];
    
    //Set the cell's textLabel text to the value of the property used for sorting.
    cell.textLabel.text = [[managedObject valueForKey:_sortPropertyName] description];
    
    //Check if the viewable property is turned off, if so disallow selection from index
    if (self.isViewable == NO) {
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        return;
    }else{
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}

/查询操作

- (void)refreshData{
    
    //Create Fetch Request with Entity Provided
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:self.entityName];
    
    //Add Sort-By Property
    fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:_sortPropertyName ascending:YES]];
    
    //Create FetchResults Controller with FetchRequest
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_managedObjectContext sectionNameKeyPath:nil cacheName:nil];
    
    //Assign Delegate
    _fetchedResultsController.delegate = self;
    
    //Execute Fetch
    [_fetchedResultsController performFetch:nil];
    
    //Refresh Data
    [self.tableView reloadData];
    
}

///删除操作

if (buttonIndex == 0) {
        //Delete Object and Save Context
        [self.managedObjectContext deleteObject:_entity];
        [self.managedObjectContext save:nil];

        //Pop Navigation Controller
        [self.navigationController popViewControllerAnimated:YES];
    }

增加操作

 Card * card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:self.managedObjectContext];
    card.no = @430424;
    person.card = card;
    
    NSError * error = nil;
    [self.managedObjectContext save:&error];
    if (error) {
        NSLog(@"inser error");
    }

/更新操作------很好奇是怎么实现的

 [_entity setValue:intValue forKey:[[_attributes objectAtIndex:inIndexPath.row] description]
/
-(void)saveObject{
    
    //Save Object and Context
    [self.managedObjectContext save:nil];
}

网友解答: 你拿出来的NSManagedObject只是个指针,你对数据的操作要么通过setValue方法要么通过@dynamic的属性

反证你每次的set数据的操作他背后都会记录你干了什么,丢队列里,save的时候一口气生成sql处理就搞定了~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值