CoreData的使用之二
2015-10-27 19:07
459 查看
一、导入 库CoreData.framework 和头文件,创建数据模型。
具体的步骤看截图:
图一
图二
图三
图四
图五
二、语法:
a)Entity - NSEntityDescriptionEntity 相当于数据库中的一个表,它描述一种抽象数据类型,其对应的类为 NSManagedObject 或其子类。NSEntityDescription 常用方法:+insertNewObjectForEntityForName:inManagedObjectContext: 工厂方法,根据给定的 Entity 描述,生成相应的 NSManagedObject 对象,并插入
ManagedObjectContext 中。-managedObjectClassName 返回映射到 Entity 的 NSManagedObject 类名-attributesByName 以名字为 key, 返回 Entity 中对应的 Attributes-relationshipsByName 以名字为 key, 返回 Entity 中对应的 Relationships
/*
在声明property属性后,有2种实现选择
@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行时动态生成子类属性
*/
@dynamic这个关键词,通常是用不到的。
它与@synthesize的区别在于:
使用@synthesize编译器会确实的产生getter和setter方法,而@dynamic仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。
三、
初始化coreData数据库管理相关对象
//一,获取数据模型文件(xcdatamodel文件),有两种方式可以获取数据模型文件。
// //1,xxx.xcdatamodeld放在沙盒中变成了xxx.momd
扩展名所以:
// NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"momd"];
// NSURL *url = [NSURL fileURLWithPath:path];//把本地资源路径转化为url
// NSManagedObjectModel *modelFile = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
//2,获取沙盒中
所有的xxx.xcdatamodeld创建成对象
NSManagedObjectModel * modelFile=[NSManagedObjectModel
mergedModelFromBundles:nil];
//二,创建持久存储协调器
NSPersistentStoreCoordinator * persistentStoreCoordinator=[[NSPersistentStoreCoordinator
alloc]initWithManagedObjectModel:modelFile];
//三,指定本地存储的数据库路径
NSString * sqlitePath=[NSString
stringWithFormat:@"%@/Documents/School.sqlite",NSHomeDirectory()];
NSLog(@"%@",sqlitePath);
/*
COREDATA_EXTERN NSString * const NSSQLiteStoreType
COREDATA_EXTERN NSString * const NSXMLStoreType
COREDATA_EXTERN NSString * const NSBinaryStoreType
*/
NSError * error=nil;
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL
fileURLWithPath:sqlitePath] options:nil
error:&error];
if (error) {
NSLog(@"数据库路径添加失败:%@",error);
}
//四,创建上下文
_context=[[NSManagedObjectContext
alloc]init];
_context.persistentStoreCoordinator=persistentStoreCoordinator;
四、coreData的增删改查
a>增加记录
//创建一个模型对象,千万不用用[[Student alloc]init];
Student * oneStudent=[NSEntityDescription
insertNewObjectForEntityForName:@"Student"
inManagedObjectContext:_context];
//设置值
oneStudent.id=[NSNumber
numberWithInt:[self.idTF.text
intValue]];
oneStudent.name=self.nameTF.text;
NSError * error=nil;
//同步到本地
[_context
save:&error];
if (error) {
NSLog(@"插入一个学生失败:%@",error);
}else{
NSLog(@"插入一个学生成功");
}
b>删除
-(void)deleteWithName:(NSString *)oneName{
//先找
再删除
NSArray *arr = [self
findDataWithName:self.nameTF.text];
///遍历数组
for (Student *oneStudent
in arr) {
//删除找到的
[_context
deleteObject:oneStudent];
}
//上面
执行的是 从内存
数据库 删除
//下面
要保存才会 同步到本地
if (![_context
save:nil]) {
NSLog(@"delete error");
}
}
c>修改
-(void)change{
//先找
再修改
NSArray *arr = [self
findDataWithName:self.nameTF.text];
///遍历数组
for (Student *oneStudent
in arr) {
oneStudent.id = [NSNumber
numberWithInt:[self.idTF.text
intValue]];
}
//下面
要保存才会 同步到本地
if (![_context
save:nil]) {
NSLog(@"update error");
}
}
d>查阅
//根据名字
向数据库进行查询
- (NSArray *)findDataWithName:(NSString *)newName {
//1.创建一个查找请求
NSFetchRequest *request = [[NSFetchRequest
alloc]
init];
//1.1设置
查询数据模型
request.entity = [NSEntityDescription
entityForName:@"Student"
inManagedObjectContext:_context];
/*
NSPredicate用于查询和过滤
在SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate.
NSPredicate 不单可以和COREDATA中的FetchRequest
配合使用。也可以与NSArray配合使用。
1、>,<,>=,<=,=
比较运算符。
如:
NSPredicate * qcondition= [NSPredicate predicateWithFormat:@"salary >= 10000"];
2、字符串操作(包含):BEGINSWITH、ENDSWITH、CONTAINS
如:
@"employee.name BEGINSWITH[cd] '李'" //姓李的员工
@"employee.name ENDSWITH[c] '梦'" //以梦结束的员工
@"employee.name CONTAINS[d] '宗'" //包含有"宗"字的员工
注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。
3、范围:IN
,BWTEEN
如:
@"salary BWTEEN {5000,10000}"
@"em_dept IN '开发'"
4、自身:SELF,这个只针对字符数组起作用。
如:
NSArray * test = =[NSArray arrayWithObjects: @"guangzhou", @"beijing", @"shanghai", nil];
@"SELF='beijing'"
5、通配符:LIKE
LIKE 使用?表示一个字符,*表示多个字符,也可以与c、d
连用。
如:
@"car.name LIKE '?he?'" //四个字符中,中间为he
@"car.name LIKE '*jp'" //以jp结束
6、正则表达式:MATCHES
如:
NSString *regex = @"^E.+e$";//以E
开头,以e
结尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Employee"]){
NSLog(@"matches YES");
}else{
NSLog(@"matches NO");
}
7、逻辑运算符:AND、OR、NOT
如:
@"employee.name = 'john' AND employee.age = 28"
8、占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
占位符就是字典对象里的key,因此你可以有多个占位符,只要key
不一样就可以了。
*/
//1.2设置谓词
//如果
不设置谓词 默认
查询 数据库所有的数据
if (newName) {
//如果 newName
有值
根据名字找 设置谓词
//谓词 @"name like xiaohong"--》表示
查询
数据库 中数据模型
属性name 是 xiaohong的所有的模型对象
//模糊查询@"name like *xiaohong*"//查询
包含 xiaohong
字符串的name属性
/*
NSString *str = [NSString stringWithFormat:@"name like *%@*",newName];
request.predicate = [NSPredicate predicateWithFormat:str];
*/
request.predicate = [NSPredicate
predicateWithFormat:@"name like %@",newName];
}
//1.3设置排序准则(如果需要)
//实例化排序准则
//按照 age
属性的值
降序 排列
NSSortDescriptor *sort1 = [NSSortDescriptor
sortDescriptorWithKey:@"id"
ascending:YES];
//按照属性 name
的值
升序排列
NSSortDescriptor *sort2 = [NSSortDescriptor
sortDescriptorWithKey:@"name"
ascending:YES];
//如果
按照 sort1排序 age
出现相同
,那么再按照sort2name 升序排序
request.sortDescriptors =
@[sort1,sort2];
//执行查询
函数
return [_context
executeFetchRequest:request error:nil];
}
具体的步骤看截图:
图一
图二
图三
图四
图五
二、语法:
a)Entity - NSEntityDescriptionEntity 相当于数据库中的一个表,它描述一种抽象数据类型,其对应的类为 NSManagedObject 或其子类。NSEntityDescription 常用方法:+insertNewObjectForEntityForName:inManagedObjectContext: 工厂方法,根据给定的 Entity 描述,生成相应的 NSManagedObject 对象,并插入
ManagedObjectContext 中。-managedObjectClassName 返回映射到 Entity 的 NSManagedObject 类名-attributesByName 以名字为 key, 返回 Entity 中对应的 Attributes-relationshipsByName 以名字为 key, 返回 Entity 中对应的 Relationships
/*
在声明property属性后,有2种实现选择
@synthesize
编译器期间,让编译器自动生成getter/setter方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
@dynamic
告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
然后由自己实现存取方法
或存取方法在运行时动态创建绑定:主要使用在CoreData的实现NSManagedObject子类时使用,由Core Data框架在程序运行时动态生成子类属性
*/
@dynamic这个关键词,通常是用不到的。
它与@synthesize的区别在于:
使用@synthesize编译器会确实的产生getter和setter方法,而@dynamic仅仅是告诉编译器这两个方法在运行期会有的,无需产生警告。
三、
初始化coreData数据库管理相关对象
//一,获取数据模型文件(xcdatamodel文件),有两种方式可以获取数据模型文件。
// //1,xxx.xcdatamodeld放在沙盒中变成了xxx.momd
扩展名所以:
// NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"momd"];
// NSURL *url = [NSURL fileURLWithPath:path];//把本地资源路径转化为url
// NSManagedObjectModel *modelFile = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
//2,获取沙盒中
所有的xxx.xcdatamodeld创建成对象
NSManagedObjectModel * modelFile=[NSManagedObjectModel
mergedModelFromBundles:nil];
//二,创建持久存储协调器
NSPersistentStoreCoordinator * persistentStoreCoordinator=[[NSPersistentStoreCoordinator
alloc]initWithManagedObjectModel:modelFile];
//三,指定本地存储的数据库路径
NSString * sqlitePath=[NSString
stringWithFormat:@"%@/Documents/School.sqlite",NSHomeDirectory()];
NSLog(@"%@",sqlitePath);
/*
COREDATA_EXTERN NSString * const NSSQLiteStoreType
COREDATA_EXTERN NSString * const NSXMLStoreType
COREDATA_EXTERN NSString * const NSBinaryStoreType
*/
NSError * error=nil;
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL
fileURLWithPath:sqlitePath] options:nil
error:&error];
if (error) {
NSLog(@"数据库路径添加失败:%@",error);
}
//四,创建上下文
_context=[[NSManagedObjectContext
alloc]init];
_context.persistentStoreCoordinator=persistentStoreCoordinator;
四、coreData的增删改查
a>增加记录
//创建一个模型对象,千万不用用[[Student alloc]init];
Student * oneStudent=[NSEntityDescription
insertNewObjectForEntityForName:@"Student"
inManagedObjectContext:_context];
//设置值
oneStudent.id=[NSNumber
numberWithInt:[self.idTF.text
intValue]];
oneStudent.name=self.nameTF.text;
NSError * error=nil;
//同步到本地
[_context
save:&error];
if (error) {
NSLog(@"插入一个学生失败:%@",error);
}else{
NSLog(@"插入一个学生成功");
}
b>删除
-(void)deleteWithName:(NSString *)oneName{
//先找
再删除
NSArray *arr = [self
findDataWithName:self.nameTF.text];
///遍历数组
for (Student *oneStudent
in arr) {
//删除找到的
[_context
deleteObject:oneStudent];
}
//上面
执行的是 从内存
数据库 删除
//下面
要保存才会 同步到本地
if (![_context
save:nil]) {
NSLog(@"delete error");
}
}
c>修改
-(void)change{
//先找
再修改
NSArray *arr = [self
findDataWithName:self.nameTF.text];
///遍历数组
for (Student *oneStudent
in arr) {
oneStudent.id = [NSNumber
numberWithInt:[self.idTF.text
intValue]];
}
//下面
要保存才会 同步到本地
if (![_context
save:nil]) {
NSLog(@"update error");
}
}
d>查阅
//根据名字
向数据库进行查询
- (NSArray *)findDataWithName:(NSString *)newName {
//1.创建一个查找请求
NSFetchRequest *request = [[NSFetchRequest
alloc]
init];
//1.1设置
查询数据模型
request.entity = [NSEntityDescription
entityForName:@"Student"
inManagedObjectContext:_context];
/*
NSPredicate用于查询和过滤
在SQL中作为查询条件通常用WHERE,但在COREDATA中作为查询条件就可以用到NSPredicate.
NSPredicate 不单可以和COREDATA中的FetchRequest
配合使用。也可以与NSArray配合使用。
1、>,<,>=,<=,=
比较运算符。
如:
NSPredicate * qcondition= [NSPredicate predicateWithFormat:@"salary >= 10000"];
2、字符串操作(包含):BEGINSWITH、ENDSWITH、CONTAINS
如:
@"employee.name BEGINSWITH[cd] '李'" //姓李的员工
@"employee.name ENDSWITH[c] '梦'" //以梦结束的员工
@"employee.name CONTAINS[d] '宗'" //包含有"宗"字的员工
注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。
3、范围:IN
,BWTEEN
如:
@"salary BWTEEN {5000,10000}"
@"em_dept IN '开发'"
4、自身:SELF,这个只针对字符数组起作用。
如:
NSArray * test = =[NSArray arrayWithObjects: @"guangzhou", @"beijing", @"shanghai", nil];
@"SELF='beijing'"
5、通配符:LIKE
LIKE 使用?表示一个字符,*表示多个字符,也可以与c、d
连用。
如:
@"car.name LIKE '?he?'" //四个字符中,中间为he
@"car.name LIKE '*jp'" //以jp结束
6、正则表达式:MATCHES
如:
NSString *regex = @"^E.+e$";//以E
开头,以e
结尾的字符。
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Employee"]){
NSLog(@"matches YES");
}else{
NSLog(@"matches NO");
}
7、逻辑运算符:AND、OR、NOT
如:
@"employee.name = 'john' AND employee.age = 28"
8、占位符:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"Name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
占位符就是字典对象里的key,因此你可以有多个占位符,只要key
不一样就可以了。
*/
//1.2设置谓词
//如果
不设置谓词 默认
查询 数据库所有的数据
if (newName) {
//如果 newName
有值
根据名字找 设置谓词
//谓词 @"name like xiaohong"--》表示
查询
数据库 中数据模型
属性name 是 xiaohong的所有的模型对象
//模糊查询@"name like *xiaohong*"//查询
包含 xiaohong
字符串的name属性
/*
NSString *str = [NSString stringWithFormat:@"name like *%@*",newName];
request.predicate = [NSPredicate predicateWithFormat:str];
*/
request.predicate = [NSPredicate
predicateWithFormat:@"name like %@",newName];
}
//1.3设置排序准则(如果需要)
//实例化排序准则
//按照 age
属性的值
降序 排列
NSSortDescriptor *sort1 = [NSSortDescriptor
sortDescriptorWithKey:@"id"
ascending:YES];
//按照属性 name
的值
升序排列
NSSortDescriptor *sort2 = [NSSortDescriptor
sortDescriptorWithKey:@"name"
ascending:YES];
//如果
按照 sort1排序 age
出现相同
,那么再按照sort2name 升序排序
request.sortDescriptors =
@[sort1,sort2];
//执行查询
函数
return [_context
executeFetchRequest:request error:nil];
}
相关文章推荐
- Objective-C总Runtime的那点事儿(一)消息机制
- libev / libuv / python tornado / nginx 性能比较
- hihocodxer1187 Divisors
- Activity进阶知识整理
- opencv 实现导向滤波
- IIS7.5应用程序池集成模式和经典模式的区别【转】
- UVa10047 The Monocycle
- BZOJ1083繁忙的都市
- 《windows程序设计》选择文件
- Android自定义ListView
- [DEEP LEARNING An MIT Press book in preparation]Deep Learning for AI
- android 实现button单击双击事件同时监控
- 求数组的子数组之和的最大值
- 软体project(四)——一生
- 基础数论模版
- Win32 API 选择文件和文件夹
- python 学习笔记(02)
- JavaScript—————DOM
- CentOS6.4下安装TeamViewer8
- android文件存储