坚持 成长 每日一篇
Coredata是iOS5之后添加的框架,使用Coredata我们可以很方便的实现对象的持久化存储。
注意:持久化:把数据保存到一个文件,而不是内存
使用前准备
使用coredata之前我们需要做一些配置
1.创建一个模型文件(文件格式为xcdatamodeld,如Model.xcdatamodeld)。相当于创建一个数据库,里面可以存放很多表。
2.选中模型文件,点击添加实体。也就是创建一个表,并配置好如图属性
。
3.创建实体类。相当于模型,这里就是创建一个继承NSManagedObject的类
new一个根据Model.xcdatamodeld的Entity表创建一个NSManagedObject的类。如图
创建完之后我们就在工程里会看到Entity类,它继承自NSManagedObject。
4.创建与数据库关联的上下文,在我们需要的使用到CoreData的.m文如下代码,这里我是在控制器.m文件里测试。
#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Entity.h"
@interface ViewController ()
{
NSManagedObjectContext *_context;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建一个模型文件。相当于创建一个数据库表,
//2.添加实体。也就是给表创建一个实体
//3.创建实体类。相当于模型
//4.生成上下文 关联模型文件生成数据库。 必须有一个对象关联上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
//model 模型文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
//持久化存储调度器
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//找到数据库要存放的目录
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//设置数据库文件名和路径,这里company.sqlite也可以写成company.db
NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"];
NSLog(@"sqlitePath=%@",sqlitePath);
//告诉Coredata存储到数据库的名字和路径
//NSSQLiteStoreType表示放在sqlite文件里
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:nil];
//上下文关联数据库
context.persistentStoreCoordinator = store;
_context = context;
// Do any additional setup after loading the view, typically from a nib.
}
注:Coredata框架也是基于对Sqlite数据库的操作完成
配置好了上下文,之后我们就可以通过对上下问的操作来访问Sqlite了。
插入对象
插入对象我们不能通过alloc来创建对象,需要通过NSEntityDescription来创建对象
-(IBAction)add
{
//Entity指的是CoreData文件下的表名
Entity *e = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:_context];
e.data = [[NSData alloc] init];
e.name = @"李斯";
e.height = @33;
NSError *error;
//完成上面的操作只是保存在上下文里,只有通过调用save:方法后才会刷新sqlite上的记录
[_context save:&error];
if (error) {
NSLog(@"%@",error);
}
}
获取对象
获取sqlite里面的对象我们需要通过发起fetch Request请求来获取,在request里面我们还可以设置过滤的条件和排序的方式。
-(IBAction)read
{
//通过fetch Request:抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
//设置过滤条件,如果没有设置过滤请求,会获取所有的对象
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"李斯"];
request.predicate = pre;
//设置排序 sort 排序 ascending:升序 yes表示生序,no表示降序
NSSortDescriptor *heightSort =[NSSortDescriptor sortDescriptorWithKey:@"height" ascending:NO];
request.sortDescriptors = @[heightSort];
//执行抓取请求
NSError *error;
NSArray *array = [_context executeFetchRequest:request error:&error];
if (error) {
NSLog(@"error = %@",error);
}
for (Entity *e in array) {
NSLog(@"e.name = %@,height = %@",e.name,e.height);
}
}
更新对象
更新对象前我们必须先获取我们要更新的对象
-(IBAction)update
{
//操作:将所有名为李斯纪录改为名为王五的纪录
//1.获取对象所有名为李斯的记录
//通过fetch Request:抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
//获取所有名为李斯的记录
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"李斯"];
request.predicate = pre;
//执行抓取请求
NSError *error;
NSArray *array = [_context executeFetchRequest:request error:&error];
if (error) {
NSLog(@"error = %@",error);
}
//2.修改纪录的值为王五
for (Entity *e in array) {
e.name = @"王五";
}
//3.保存上下文到sqlite
[_context save:nil];
}
删除对象
删除对象只有完成了save:方法后sqlite才真正的完成删除。
-(IBAction)delete
{ //操作:将身高为12的纪录删除
//1.获取身高为12的纪录
//通过fetch Request:抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
//获取所有名为李斯的记录
NSPredicate *pre = [NSPredicate predicateWithFormat:@"height = %@",@"12"];
request.predicate = pre;
//执行抓取请求
NSError *error;
NSArray *array = [_context executeFetchRequest:request error:&error];
if (error) {
NSLog(@"error = %@",error);
}
//2.删除记录,这里只是将上下中的对象删除
for (Entity *e in array) {
[_context deleteObject:e];
}
//3.保存,只有保存之后,数据库中的内容才会同时删除
[_context save:nil];
}
小结
什么时候使用COredata 什么时候使用FMDatabases
CoreData 在公司使用的比较少,用户的比较多的是FMDatabases
数据存储的结构比较简单的时候,使用CoreData
CoreData开发效率会高点,因为它是面向对象,而且不用写sql语句。
FMDatabases 数据结果比较复杂的时候,表与表之前的关联比较多的时候使用