详情参考: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处理就搞定了~~