L12 Documents and Core Data
一、面向对象与数据库的桥梁 Core Data。
1.how does it work
·创建一个可视映射(实体(一条记录的表?)、属性、关系)。
·
2.NSManagedObject ,数据库中所有对象的超类。
3.NSManagedObjectContext ,代码与数据库的衔接,操作数据库。(在数据库中创建对象、设置属性)。
· 建议用法:创建UIManagedDocument ,访问其属性managedObjectContext。(UIManagedDocument类中对NSManagedObjectContext做了很好的处理。)
4.UIManagedDocument, Core Data database的容器,管理Core Data database的存储(打开关闭保存)。自动保存、自动关闭。
[[UIManagedDocument alloc]initWithFileURL:(可通过NSFileManager获得用户文件目录。)]
·需判断文件是否已在文件系统中(如图)fileExistsAtPath。open or create
· 检查 documentState
UIDocumentStateNormal\UIDocumentStateClosed\ UIDocumentStateSavingError\ UIDocumentStateEditingDisable\ UIDocumentStateInConflict
5. 可通过监听NSManagedObjectContext 知道文件(数据库)的变化,并获取变更信息(增删改) :NSManagedObjectContextDidSaveNotification
合并更改:
-(void)mergeChangesFromContextDidSaveNotification:(NSNotification*) notification
6.操作数据库(操作一张表时,相关联的表会自动更新):
· 插入对象(记录)
[NSEntityDescription insertNewObjectsForEntityForName:inMangeObjectContext:]
设置属性和属性值:
使用协议NSKeyValueCode(由NSDictionary实现)的方法:
-(id)valueForKey;或-(id)valueForKeyPath:;
-(id)setValue:forKey:;
或(id)setValue:forKeyPath:;
· 删除对象(记录)
[aDocument.managedObjectContext deleteObject:aObj];
aObj=nil;
NSManagedObject的子类中的Categories中,可以放一个so cool的方法:
·查询NSFetchRequest
[NSFetchRequest fetchRequestWithEntityName:]
.fetchBatchSize...
① 要取回的实体(类型当然相同)
② fetchBatchSize,数量默认all
③ NSSortDescriptor 排序描述器,返回的数组根据某一属性某种方式排序
④ NSPreDicate 谓语(类似 于SQL语句)
[NSPredicate predicateWithFormat:@"aProperty contain %@",aName];
谓语比如: contains contains[c](忽略大小写) > < =
符合谓语:NSCompoundPredicate AND OR
e.g.@(name=%@) OR (title=%@)
或,NSArray *array=@[p1,p2];
NSPredicate*predicate= [NSCompoundPredicate andPredicateWithSubpredicate:array];
·键值编码 @count @avg...
@"photos.@count>5"
NSArray *array =[context executeFetchRequest:request error:&error];
-(void)prepareForDeletion{}
7.不建议直接在NSManagedObject的子类中添加方法,可使用Categories,添加方法到一个类而不创建其子类。不能有实例变量。。。
@interface toClass(要添加方法的类名) (Categories (此Categories名))
methods
property
@end
实现 @implementation ....
@end
8.线程安全
建议使用[context performBlock:^{}]
![]()
一、面向对象与数据库的桥梁 Core Data。
1.how does it work
·创建一个可视映射(实体(一条记录的表?)、属性、关系)。
·
2.NSManagedObject ,数据库中所有对象的超类。
3.NSManagedObjectContext ,代码与数据库的衔接,操作数据库。(在数据库中创建对象、设置属性)。
· 建议用法:创建UIManagedDocument ,访问其属性managedObjectContext。(UIManagedDocument类中对NSManagedObjectContext做了很好的处理。)
4.UIManagedDocument, Core Data database的容器,管理Core Data database的存储(打开关闭保存)。自动保存、自动关闭。
[[UIManagedDocument alloc]initWithFileURL:(可通过NSFileManager获得用户文件目录。)]
·需判断文件是否已在文件系统中(如图)fileExistsAtPath。open or create
· 检查 documentState
UIDocumentStateNormal\UIDocumentStateClosed\ UIDocumentStateSavingError\ UIDocumentStateEditingDisable\ UIDocumentStateInConflict
5. 可通过监听NSManagedObjectContext 知道文件(数据库)的变化,并获取变更信息(增删改) :NSManagedObjectContextDidSaveNotification
合并更改:
-(void)mergeChangesFromContextDidSaveNotification:(NSNotification*) notification
6.操作数据库(操作一张表时,相关联的表会自动更新):
· 插入对象(记录)
[NSEntityDescription insertNewObjectsForEntityForName:inMangeObjectContext:]
设置属性和属性值:
使用协议NSKeyValueCode(由NSDictionary实现)的方法:
-(id)valueForKey;或-(id)valueForKeyPath:;
-(id)setValue:forKey:;
或(id)setValue:forKeyPath:;
· 删除对象(记录)
[aDocument.managedObjectContext deleteObject:aObj];
aObj=nil;
NSManagedObject的子类中的Categories中,可以放一个so cool的方法:
·查询NSFetchRequest
[NSFetchRequest fetchRequestWithEntityName:]
.fetchBatchSize...
① 要取回的实体(类型当然相同)
② fetchBatchSize,数量默认all
③ NSSortDescriptor 排序描述器,返回的数组根据某一属性某种方式排序
④ NSPreDicate 谓语(类似 于SQL语句)
[NSPredicate predicateWithFormat:@"aProperty contain %@",aName];
谓语比如: contains contains[c](忽略大小写) > < =
符合谓语:NSCompoundPredicate AND OR
e.g.@(name=%@) OR (title=%@)
或,NSArray *array=@[p1,p2];
NSPredicate*predicate= [NSCompoundPredicate andPredicateWithSubpredicate:array];
·键值编码 @count @avg...
@"photos.@count>5"
NSArray *array =[context executeFetchRequest:request error:&error];
-(void)prepareForDeletion{}
7.不建议直接在NSManagedObject的子类中添加方法,可使用Categories,添加方法到一个类而不创建其子类。不能有实例变量。。。
@interface toClass(要添加方法的类名) (Categories (此Categories名))
methods
property
@end
实现 @implementation ....
@end
8.线程安全
建议使用[context performBlock:^{}]