合肥网站建设 卫来网络,建设工程资质证书二维码扫描网站,汝州住房和城乡建设网站,别人品牌的域名做网站吗一、概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是#xff1a;SQLite数据库#xff0c;XML#xff0c;二进制#xff0c;内存里#xff0c;或自定义数据类型 3.好处#xff1a;能够合理管理内存#xff0c;避免使用sql的麻烦#xff0c;高效… 一、概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是SQLite数据库XML二进制内存里或自定义数据类型 3.好处能够合理管理内存避免使用sql的麻烦高效 4.构成 (1)NSManagedObjectContext被管理的数据上下文 操作实际内容操作持久层 作用插入数据查询数据删除数据 (2)NSManagedObjectModel被管理的数据模型 数据库所有表格或数据结构包含各实体的定义信息 作用添加实体的属性建立属性之间的关系 操作方法视图编辑器或代码 (3)NSPersistentStoreCoordinator持久化存储助理 相当于数据库的连接器 作用设置数据存储的名字位置存储方式和存储时机 (4)NSManagedObject被管理的数据记录 相当于数据库中的表格记录 (5)NSFetchRequest获取数据的请求 相当于查询语句 (6)NSEntityDescription实体结构 相当于表格结构 (7)后缀为.xcdatamodeld的包 里面是.xcdatamodel文件用数据模型编辑器编辑 编译后为.momd或.mom文件 5.依赖关系 二、基于SQLite数据库时Core Data的简单使用 和SQLite的区别只能取出整个实体记录然后分解之后才能得到实体的某个属性 1.构建流程 包括创建数据上下文创建数据模型创建数据持久化存储助理 1若是新建的工程选择空白应用程序next 勾选Use Core Data选项 此时生成的工程文件AppDelegate中会自动生成被管理的数据上下文等相关代码 2比如AppDelegate.h文件中自动生成 property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory; 方法saveContext表示保存数据到持久层数据库 方法applicationDocumentsDirectory表示应用程序沙箱下的Documents目录路径 (例如/var/mobile/Applications/5FG80A45-DFB5-4087-A1B1-41342A977E21/Documents/) 3比如AppDelegate.h文件中自动生成 synthesize managedObjectContext __managedObjectContext;
synthesize managedObjectModel __managedObjectModel;
synthesize persistentStoreCoordinator __persistentStoreCoordinator; 保存数据到持久层 - (void)applicationWillTerminate:(UIApplication *)application
{[self saveContext];
} - (void)saveContext
{NSError *error nil;NSManagedObjectContext *managedObjectContext self.managedObjectContext;if (managedObjectContext ! nil) {if ([managedObjectContext hasChanges] ![managedObjectContext save:error]) {NSLog(Unresolved error %, %, error, [error userInfo]);abort();} }
} Documents目录路径 - (NSURL *)applicationDocumentsDirectory
{return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
} 被管理的数据上下文 初始化的后必须设置持久化存储助理 - (NSManagedObjectContext *)managedObjectContext
{if (__managedObjectContext ! nil) {return __managedObjectContext;}NSPersistentStoreCoordinator *coordinator [self persistentStoreCoordinator];if (coordinator ! nil) {__managedObjectContext [[NSManagedObjectContext alloc] init];[__managedObjectContext setPersistentStoreCoordinator:coordinator];}return __managedObjectContext;
} 被管理的数据模型 初始化必须依赖.momd文件路径而.momd文件由.xcdatamodeld文件编译而来 - (NSManagedObjectModel *)managedObjectModel
{if (__managedObjectModel ! nil) {return __managedObjectModel;}NSURL *modelURL [[NSBundle mainBundle] URLForResource:TestApp withExtension:momd];__managedObjectModel [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];return __managedObjectModel;
} 持久化存储助理 初始化必须依赖NSManagedObjectModel之后要指定持久化存储的数据类型默认的是NSSQLiteStoreType即SQLite数据库并指定存储路径为Documents目录下以及数据库名称 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{if (__persistentStoreCoordinator ! nil) {return __persistentStoreCoordinator;}NSURL *storeURL [[self applicationDocumentsDirectory] URLByAppendingPathComponent:TestApp.sqlite];NSError *error nil;__persistentStoreCoordinator [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:error]) {NSLog(Unresolved error %, %, error, [error userInfo]);abort();} return __persistentStoreCoordinator;
} 如果不是新工程也可以自己写入相关代码 4此外还生成了TestApp.xcdatamodeld文件 5还自动链接了CoreData.framework 6在预编译头.pch文件中加入导入了CoreData.h头文件 #import CoreData/CoreData.h 2.创建数据模型数据模型编辑器操作 1创建实体 选中.xcodedatamodel对象 在右边的数据模型编辑器的底部工具栏点击Add Entity添加实体 在最右侧栏对实体命名 2创建实体属性 选中实体点击底部工具栏的Add Attribute添加属性 选中新添加的属性对属性进行命名并设置属性的数据类型Attribute Type 3为两个实体建立关系 选中一个实体在底部工具栏点击Add Relationship添加关系 选中新关系对关系添加名称目标destination设置为另个实体 4建立返回关系 当你建立一个目标关系最好建立一个返回关系 在另一个实体中建立一个关系并命名设置目标对象为这之前的实体 并在Inverse属性选这之前的关系名称 5设置两个关系的删除规则Delete Rule都为关联模式 关联模式cascade其中一个数据被删除另一个实体中的数据也会跟着删除 6最终两个对象的关系图为 切换Editor Stype按钮 会看到另一种编辑方式 3.插入数据 在AppDelegate.m的application:didFinishLaunchingWithOptions:方法里调用自定义方法 insertCoreData插入数据代码如下 - (void)insertCoreData
{NSManagedObjectContext *context [self managedObjectContext];NSManagedObject *contactInfo [NSEntityDescription insertNewObjectForEntityForName:ContactInfo inManagedObjectContext:context];[contactInfo setValue:name B forKey:name];[contactInfo setValue:birthday B forKey:birthday];[contactInfo setValue:age B forKey:age];NSManagedObject *contactDetailInfo [NSEntityDescription insertNewObjectForEntityForName:ContactDetailInfo inManagedObjectContext:context];[contactDetailInfo setValue:address B forKey:address];[contactDetailInfo setValue:name B forKey:name];[contactDetailInfo setValue:telephone B forKey:telephone];[contactDetailInfo setValue:contactInfo forKey:info];[contactInfo setValue:contactDetailInfo forKey:details];NSError *error;if(![context save:error]){NSLog(不能保存%,[error localizedDescription]);}
} 创建数据上下文调用insertNewObjectForName方法创建两个数据记录NSManagedObject然后就可以对之前数据模型编辑视图中定义的属性进行赋值。此时的数据只在内存中被修改最后调用数据上下文的save方法保存到持久层 4.查询数据 在调用了insertCoreData之后可以调用自定的查询方法dataFetchRequest来查询插入的数据 - (void)dataFetchRequest
{NSManagedObjectContext *context [self managedObjectContext];NSFetchRequest *fetchRequest [[[NSFetchRequest alloc] init] autorelease];NSEntityDescription *entity [NSEntityDescription entityForName:ContactInfo inManagedObjectContext:context];[fetchRequest setEntity:entity];NSError *error;NSArray *fetchedObjects [context executeFetchRequest:fetchRequest error:error];for (NSManagedObject *info in fetchedObjects) {NSLog(name:%, [info valueForKey:name]);NSLog(age:%, [info valueForKey:age]);NSLog(birthday:%, [info valueForKey:birthday]);NSManagedObject *details [info valueForKey:details];NSLog(address:%, [details valueForKey:address]);NSLog(telephone:%, [details valueForKey:telephone]);}
} fetchRequest相当于sql查询语句的包装类需要用setEntity方法来指定具体查询的实体结构表结构 通过NSEntityDescription的entityForName方法来返回指向该具体实体结构的指针 然后调用executeFetchRequest:error:方法来执行查询操作如果操作成功则返回对应的数据记录数组 其中可以通过NSManagedObject数据记录对象里关联的属性查询另一个数据记录对象里的属性 5.数据模版 为每个实体生成一个NSManagedObject子类 上面设置数据和获取数据时使用的是Key-Value方式更好的方法是通过生成强类型的NSManagedObject的子类通过类的成员属性来访问和获取数据 1在数据编辑器视图中选中实体对象 选则file菜单点击new点击file...选择Core Data项选择NSManagedObject subclass生成该实体同名的类 继承于NSManagedObject 生成对应的ContactInfo.h文件 #import Foundation/Foundation.h
#import CoreData/CoreData.hclass ContactDetailInfo;interface ContactInfo : NSManagedObjectproperty (nonatomic, retain) NSString * age;
property (nonatomic, retain) NSString * birthday;
property (nonatomic, retain) NSString * name;
property (nonatomic, retain) ContactDetailInfo *details;end 和ContactInfo.m文件 其中dynamic告诉编译器不做处理使编译通过其getter和setter方法会在运行时动态创建由Core Data框架为此类属性生成存取方法 #import ContactInfo.h
#import ContactDetailInfo.himplementation ContactInfodynamic age;
dynamic birthday;
dynamic name;
dynamic details;end 以及ContactDetailInfo.h文件 #import Foundation/Foundation.h
#import CoreData/CoreData.hclass ContactInfo;interface ContactDetailInfo : NSManagedObjectproperty (nonatomic, retain) NSString * address;
property (nonatomic, retain) NSString * name;
property (nonatomic, retain) NSString * telephone;
property (nonatomic, retain) ContactInfo *info;end 和ContactDetailInfo.m文件 #import ContactDetailInfo.h
#import ContactInfo.himplementation ContactDetailInfodynamic address;
dynamic name;
dynamic telephone;
dynamic info;end 此时数据模型编辑器视图最右边栏中实体的class就变成具体的类名 之前用Key-Value的代码就可以修改为 #import ContactInfo.h
#import ContactDetailInfo.h - (void)insertCoreData
{NSManagedObjectContext *context [self managedObjectContext];ContactInfo *contactInfo [NSEntityDescription insertNewObjectForEntityForName:ContactInfo inManagedObjectContext:context];contactInfo.name name B;contactInfo.birthday birthday B;contactInfo.age age B;ContactDetailInfo *contactDetailInfo [NSEntityDescription insertNewObjectForEntityForName:ContactDetailInfo inManagedObjectContext:context];contactDetailInfo.address address B;contactDetailInfo.name name B;contactDetailInfo.telephone telephone B;contactDetailInfo.info contactInfo;contactInfo.details contactDetailInfo;NSError *error;if(![context save:error]){NSLog(不能保存%,[error localizedDescription]);}
} - (void)dataFetchRequest
{NSManagedObjectContext *context [self managedObjectContext];NSFetchRequest *fetchRequest [[[NSFetchRequest alloc] init] autorelease];NSEntityDescription *entity [NSEntityDescription entityForName:ContactInfo inManagedObjectContext:context];[fetchRequest setEntity:entity];NSError *error;NSArray *fetchedObjects [context executeFetchRequest:fetchRequest error:error];for (ContactInfo *info in fetchedObjects) {NSLog(name:%, info.name);NSLog(age:%, info.age);NSLog(birthday:%, info.birthday);ContactDetailInfo *details info.details;NSLog(address:%, details.address);NSLog(telephone:%, details.telephone);}
} 三、数据库相关 1.打印隐藏的sql语句 在Edit Scheme中选择Run之后进入Arguments标签添加参数“-com.apple.CoreData.SQLDebug 1” 2.使用SQLite存储时数据库结构 存储的SQLite数据库表名称大写“Z”加上实体名称大写一个实体相当于一张表 具体的字段名称大写“Z”加上实体属性名称大写 转载自http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html