CoreData
使用Core Data能让你为Model层写的代码的行数减少为原来的50%到70%,它能利用Model层的信息和运行时的特性,而不通过程序层的代码实现。coreData主要是iOS对sqlite数据库的封装。coreData有对象-关系的映射的功能,能把OC的对象存储成数据库或xml,如果数据存储使用的是coreData,那么读取时可以不使用SQL语句。coreData 类似于 我们之前使用的FMDB
coredata步骤
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];
}