请尊重原创的劳动成果:罗朝辉(http://www.cppblog.com/kesalin)
http://www.cppblog.com/ipzyh/articles/CoreData.html
Entity - NSEntityDescription
Entity 相当于数据库中的一个表,它描述一种抽象数据类型,其对应的类为 NSManagedObject 或其子类。
NSEntityDescription 常用方法:
+insertNewObjectForEntityForName:inManagedObjectContext: 工厂方法,根据给定的
Entity 描述,生成相应的 NSManagedObject 对象,并插入 ManagedObjectContext 中。
-managedObjectClassName 返回映射到 Entity 的 NSManagedObject 类名
-attributesByName 以名字为 key, 返回 Entity 中对应的 Attributes
-relationshipsByName 以名字为 key, 返回 Entity 中对应的 Relationships
Property - NSPropertyDescription
2)Property - NSPropertyDescription
Property 为 Entity 的特性,它相当于数据库表中的一列,或者 XML 文件中的 value-key 对中的
key。它可以描述实体数据(Attribute),Entity之间的关系(RelationShip),或查询属性(Fetched
Property)。
> Attribute - NSAttributeDescription
Attribute 存储基本数据,如 NSString, NSNumber or NSDate 等。它可以有默认值,也可以使用正则表达式或其他条件对其值进行限定。一个属性可以是 optional 的。
> Relationship - NSRelationshipDescription
Relationship 描述 Entity,Property 之间的关系,可以是一对一,也可以是一对多的关系。
> Fetched Property - NSFetchedPropertyDescription
Fetched Property 根据查询谓词返回指定 Entity 的符合条件的数据对象。
1. CoreData:单表
需要导入CoreData框架
1> 创建模型文件 [相当于一个数据库里的表]NSManagedObjectModel
2> 添加实体 [一张表]Add Entity
3> 创建实体类 [相当模型]
4> 生成上下文 关联模型文件生成数据库 NSManagedObjectContext
关联的时候,如果本地没有数据库文件,CoreData自己会创建
2. 创建:
持久化,把数据保存到一个文件,而不是内存
// 上下文关连数据库 NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; // model模型文件 NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; // 持久化存储调度器 NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // 告诉Coredata数据库的名字和路径 NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"]; NSLog(@"%@",sqlitePath); [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:nil]; context.persistentStoreCoordinator = store; // 切记要保存 !!! _context = context;
3. 增加数据:
插入数据:用描述NSEntityDescription
Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:_context];
[_context save:&error];
4. 查询数据:
只要涉及到查询数据的都要用:NSFetchRequest(修改数据 删除数据 查询数据都需要用)谓词:NSPredicate
// 1.FectchRequest 抓取请求对象 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; // 2.设置过滤条件 NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@", @"zhangsan"]; //request.predicate = pre; // 3.设置排序 NSSortDescriptor *heigtSort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:NO]; request.sortDescriptors = @[heigtSort]; // 4.执行请求 NSError *error = nil; NSArray *emps = [_context executeFetchRequest:request error:&error]; if (error) { NSLog(@"error"); }
在对数据库中的数据进行删除和修改操作之后需要保存数据:
[_context save:nil];
知识点:
数据存储的结构比较简单的时候,使用CoreData
开发效率会高点,为什么?面向对象,而且不用写sql语句
FMDatabases 数据结果比较复杂的时候,表与表之前的关联比较的时候
5. CoreData多表:
多表的重点就是在单表的基础上增加了关联
例如:Student表和Teacher表 Student对Teacher:多对一 To One(反之:To Many)
设置关联之后可以关系名获取对方的信息
6. CoreData查询:
1> 分页查询:
fetchOffset:分页查询的起始索引
fetchLimit:每次查询数据的条数
fetchBatchSize:一次加载到内存的条数
2> 模糊查询:
模糊查询就是通过设置过滤条件来实现:
过滤条件:NSPredicate:
CONTAINS LIKE BEGINSWITH ENDSWITH
7. CoreData多个数据库:
7.1 一个数据库对应一个上下文
_companyContext = [self setupContextWithModelName:@"Company"]; _weiboContext = [self setupContextWithModelName:@"Weibo"];
使用下面的方法,如果 bundles为nil 会把bundles里面的所有模型文件的表放在一个数据库(把所有的表放在一个数据库中)
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
要想一个数据库中存储一个模型文件 需要如下代码:
// URLForResource:每个模型文件的名字 NSURL *companyURL = [[NSBundle mainBundle] URLForResource:@"Company" withExtension:@"momd"]; // 创建NSManagedObjectModel需要NSURL NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:companyURL];
7.2 如何开启CoreData的SQL语句输出开关:
点击Product--EditScheme -- Arguments -- ArgumentsPassed On Launch 添加:
1> -com.apple.CoreData.SQLDebug
2> 1
8. 网络:
OSI(Open System Interconnection)开放系统应用互联 参考模型:
从上至下:
应用层(APDU) -- 表示层(PPDU) -- 会话层(SPDU) -- 传输层(TPDU) -- 网络层(报文)-- 数据链路层(帧) -- 物理层(比特)