CoreData和管理者MagicalRecord
2015-10-26 21:17
92 查看
CoreData
使用Core Data能让你为Model层写的代码的行数减少为原来的50%到70%,它能利用Model层的信息和运行时的特性,而不通过程序层的代码实现。coreData主要是iOS对sqlite数据库的封装。coreData有对象-关系的映射的功能,能把OC的对象存储成数据库或xml,如果数据存储使用的是coreData,那么读取时可以不使用SQL语句。coreData 类似于 我们之前使用的FMDBcoredata步骤
model:
在声明property属性后,有2种实现选择
@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行的时动态生成子类属性
#import <Foundation/Foundation.h> #import <MagicalRecord/MagicalRecord.h> @interface UserModel : NSManagedObject @property (nonatomic) NSString *name; @property (nonatomic) NSNumber *age; @end #import "UserModel.h" @implementation UserModel @dynamic name; @dynamic age; @end
创建Core Data文件
new file->文件名(任意-作为数据库名) ENTITIES 的名称和model的类名相同,attributes为属性名重点内容
初始化
- (void)initCoreData { //1.取出模型文件 NSString *path = [[NSBundle mainBundle] pathForResource:@"UserModel" ofType:@"momd"]; //2.模型文件对应的类 NSManagedObjectModel *modelFile = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]]; //3.创建一个协调器 NSPersistentStoreCoordinator *coordinaor = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:modelFile]; //4.创建数据库 NSString *dbPath = [NSString stringWithFormat:@"%@/Documents/user.sqlite",NSHomeDirectory()]; //5.数据库和模型文件关联上 NSPersistentStore * store = [coordinaor addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dbPath] options:nil error:nil]; if(!store) { } //6.创建上下文对象,增删改查 通过上下文对象进行操作的 _context = [[NSManagedObjectContext alloc] init]; _context.persistentStoreCoordinator = coordinaor; }
添加
- (IBAction)add:(id)sender { UserModel *item = (UserModel *)[NSEntityDescription insertNewObjectForEntityForName:@"UserModel" inManagedObjectContext:_context]; item.name = self.name.text; item.age = @(self.age.text.integerValue); NSError *err = nil; //增删改,写入到数据库 if (![_context save:&err]) { NSLog(@"err = %@",err.description); } }
删除
- (IBAction)delete:(id)sender { //找到删除的数据 NSArray *arr = [self fetchDataWithName:self.name.text]; for (UserModel *item in arr) { [_context deleteObject:item]; } NSError *err = nil; //增删改,写入到数据库 if (![_context save:&err]) { NSLog(@"err = %@",err.description); } }
修改
- (IBAction)modify:(id)sender { //找到修改的数据 NSArray *arr = [self fetchDataWithName:self.name.text]; for (UserModel *item in arr) { item.age = @(self.age.text.integerValue); } NSError *err = nil; //增删改,写入到数据库 if (![_context save:&err]) { NSLog(@"err = %@",err.description); } }
查询
- (NSArray *)fetchDataWithName:(NSString *)name { //请求查询对象 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; //设置查询entity fetchRequest.entity = [NSEntityDescription entityForName:@"UserModel" inManagedObjectContext:_context]; //设置查询条件 if (name) { NSPredicate * predicate = [NSPredicate predicateWithFormat:@"name = %@",name]; fetchRequest.predicate = predicate; } //设置排序 NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES]; NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]; fetchRequest.sortDescriptors = @[sort1,sort2]; //把查询内容通过数组返回去 return [_context executeFetchRequest:fetchRequest error:nil]; }
MagicalRecord
//创建数据库[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"user.sqlite"];
添加
- (IBAction)add:(id)sender { //根据coreData模型创建一个UserModel对象 UserModel *item = [UserModel MR_createEntity]; item.name = self.name.text; item.age = @(self.age.text.integerValue); //存到数据库中 [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; }
删除
- (IBAction)delete:(id)sender { //删除的数据 NSArray *arr = [UserModel MR_findByAttribute:@"name" withValue:self.name.text]; for (UserModel *item in arr) { [item MR_deleteEntity]; } [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; }
修改
- (IBAction)mdify:(id)sender { NSArray * arr = [UserModel MR_findByAttribute:@"name" withValue:self.name.text]; for (UserModel *item in arr) { item.age = @(self.age.text.integerValue); } [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait]; }
查询
- (IBAction)query:(id)sender { NSArray * arr = [UserModel MR_findAllSortedBy:@"age" ascending:YES]; [self.data removeAllObjects]; [self.data addObjectsFromArray:arr]; [self.tableView reloadData]; }