CoreData 简单地使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CoreData 简单地使用相关的知识,希望对你有一定的参考价值。

先介绍一下什么是CoreData —— 它是在ios5之后出现的一个框架,提供了对象-关系映射(ORM)的功能,既能够将OC对象转化成数据,保存在SQLite数据库文件中,也能将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,类似于著名的Hibernate持久化框架。不过功能肯定没其强大。
 
例:平常我们把数据写到数据库需要写:
 
insert int Student (name, age) values (xxxx, 12);
 
如果全使用CoreData的话则不需要写此句,忽略了上面的语句,远离了SQL语句
 
Student *Stu = [ [Employee alloc] init];
Stu.name = @"xxxx";
Stu.age = 12;
 
CoreData的使用步骤
 

// 1.创建模型文件 (相当于一个数据库里的表)

// New File ———— CoreData ———— Data Model ———— Next

// 2.添加实体 (相当于一张表)

// 找到我们创建的模型文件(xxx.xcdatamodeld,我创建的叫School.xcdatamodeld)———— Add Entity ———— 添加表内属性(这边我添加2个属性(name, age))



// 3.创建实体类

// New File ———— CorData ———— NSManagedobject subclass ———— Next(记得选择需要关联的表)这样就会自动生成相应的模型



// 4.生成上下文 关联模型文件生成数据库(关联的时候,如果本地没有数据库文件,CoreData会自己创建)

// 上下文,记得引用CoreData框架

    NSManagedObjectContext *context = [[NSManagedObjectContext alloc]init];

// 上下文关联数据库

// model模型文件, 参数:mergedModelFromBundles:因为模型文件是资源文件,所以会放到BUNDLES里面,所以只需要写nil就可以了。

    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

// 持久化存储调度器(持久化:把数据保存在一个文件,而不是放在内存中)

    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

// 告诉CoreData数据库的名字和路径

    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    

    NSString *sqlitePath = [doc stringByAppendingPathComponent:@"School.sqlite"];

    [store addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nilerror:nil];

    

    context.persistentStoreCoordinator = store;

 

然后我们来测试一下是否可以写入数据

- (void)addStudent

{

    // 创建一个学生对象

//    Student *stu = [[Student alloc] init];

    Student *stu =[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];

    stu.name = @"张三";

    stu.age = @17.0;

    // 直接保存数据库

    [_context save:nil];

    

 

}

 
既然可以保存数据了,那么就肯定需要读取数据
有个抓取的概念,使用Fetch Request对象进行抓取。看图
 

- (void)readStudent

{

    // 1.FectchRequest 抓取请求对象

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

    

   // 2.执行请求

  NSArray *stus = [_context executeFetchRequest:request error:nil];

    

  for (Student *stu in stus)

  {

      NSLog(@"名字:%@ 身高:%@", stu.name, stu.age);

  }

    

}

 

接下来是更新

 

- (void)updateStudent

{

    // 1.查找

    // 1.1FectchRequest 抓取请求对象

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

    

    // 1.2设置过滤条件

    // 查找张三

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"张三"];

    request.predicate = pre;

    

    // 1.3执行请求

    NSArray *stus = [_context executeFetchRequest:request error:nil];

    // 2.更新身高

    for (Student *stu in stus) {

        stu.age = @2.0;

    }

    // 保存

    [_context save:nil];

 

}

 
 
最后是删除
 

- (void)deleteStudent

{

    // 删除李四

    

    // 1.查找

    // 1.1FectchRequest 抓取请求对象

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];

    

    // 1.2设置过滤条件

    // 查找张三

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"李四"];

    request.predicate = pre;

    

    // 1.3执行请求

    NSArray *stus = [_context executeFetchRequest:request error:nil];

    // 2.删除

    for (Student *stu in stus) {

        [_context deleteObject:stu];

    }

    

    // 3.保存

    [_context save:nil];

}

 
注:CoreData使用场景
一般在公司内使用较少,用的比较多得时FMDatabases。
数据存储结构比较简单的时候使用CoreData,开发效率会高点,比较面向对象且不用写SQL语句
FMDatabases数据结果比较复杂的时候,表与表之间的关联比较多的时候使用
 
好了,以上就是CoreData的简单使用,当然了CoreData也可以进行关联,分页等操作。会陆续更新!
 
DEMO下载地址:链接: http://pan.baidu.com/s/1i3sBsnN 密码: 5kgx

以上是关于CoreData 简单地使用的主要内容,如果未能解决你的问题,请参考以下文章

CoreData(iOS):是不是需要创建数据库才能使用CoreData?coredata可以对简单的平面文件进行操作吗? [关闭]

新项目中的 CoreData

Coredata 单表简单使用

如何在 CoreData 中保存位置

CoreData简单使用

如何最好地将应用程序从 sqlite(使用 fmdb)迁移到 CoreData?