微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

coreData 使用分析

Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来学习吧,接下来使用苹果提供的实例程序Locations来作分析:
>程序介绍:
右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能添加,编辑,删除功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
首先我们看看该程序的AppDelegate.h

[pre]view plain

    @interfaceLocationsAppDelegate:NSObject{
  1. UIWindow*window;UINavigationController*navigationController;//导航栏
  2. //以下定义了CoreData的三个决定性组建,等后面m文件里面再多介绍
  3. NSPersistentStoreCoordinator*persistentStoreCoordinator;NSManagedobjectModel*managedobjectModel;
  4. NSManagedobjectContext*managedobjectContext;}
  5. @property(nonatomic,retain)IBOutletUIWindow*window;
  6. @property(nonatomic,retain)UINavigationController*navigationController;
  7. -(IBAction)saveAction:sender;//这个没找到作用...根本就没用到IB
  8. //还记得吧,nonatomic是因为这个程序是单线程@property(nonatomic,retain,readonly)NSManagedobjectModel*managedobjectModel;
  9. @property(nonatomic,readonly)NSManagedobjectContext*managedobjectContext;@property(nonatomic,readonly)NSPersistentStoreCoordinator
  10. *persistentStoreCoordinator;@property(nonatomic,readonly)Nsstring*applicationDocumentsDirectory;
  11. //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存sqlite文件的地方@end

[/pre]

从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的 CoreData 数据的,接下来看m文件也会对此作更多的理解。
[pre] view plain
    #import"LocationsAppDelegate.h"
  1. #import"RootViewController.h"//该程序使用了一个根视图控制器,所以导入了这个类@implementationLocationsAppDelegate
  2. @synthesizewindow;@synthesizenavigationController;
  3. -(void)applicationDidFinishLaunching:(UIApplication*)application{
  4. //初始化根视图控制器,它是一个列表视图控制器RootViewController*rootViewController=[[RootViewControlleralloc]
  5. initWithStyle:UITableViewStylePlain];
  6. //通过下面的自定义getter得到CoreData的“被管理对象内容器”NSManagedobjectContext*context=[selfmanagedobjectContext];
  7. if(!context){//如果getter出错,在这里来排错
  8. }rootViewController.managedobjectContext=context;
  9. //rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
  10. UINavigationController*aNavigationController=[[UINavigationControlleralloc]initWithRootViewController:rootViewController];
  11. self.navigationController=aNavigationController;//初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
  12. [windowaddSubview:[navigationControllerview]];[windowmakeKeyAndVisible];
  13. //由于导航栏retain了根视图,所以在这里可以release掉它了
  14. [rootViewControllerrelease];//由于self已经retain了导航栏,所以导航栏可以release
  15. [aNavigationControllerrelease];}
  16. //applicationWillTerminate:在程序结束前,CoreData会保存任何对其的更改
  17. -(void)applicationWillTerminate:(UIApplication*)application{
  18. NSError*error;if(managedobjectContext!=nil){
  19. if([managedobjectContexthasChanges]&&![managedobjectContextsave:&error]){//Handletheerror.
  20. }}
  21. }
  22. //在得到点击事件后,保存更改-(IBAction)saveAction:(id)sender{
  23. NSError*error;
  24. if(![[selfmanagedobjectContext]save:&error]){//Handleerror
  25. }}
  26. //自定义的managedobjectContext的getter,它其实是真正在使用的时候的被操作对象
  27. -(NSManagedobjectContext*)managedobjectContext{
  28. //如果已经有这个对象,就直接返回,否则继续if(managedobjectContext!=nil){
  29. returnmanagedobjectContext;}
  30. NSPersistentStoreCoordinator*coordinator=[selfpersistentStoreCoordinator];
  31. if(coordinator!=nil){managedobjectContext=[[NSManagedobjectContextalloc]init];
  32. [managedobjectContextsetPersistentStoreCoordinator:coordinator];//这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
  33. //managedobjectContext需要得到这个“数据一致性存储器”}
  34. returnmanagedobjectContext;}
  35. //自定义CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系
  36. //,类似于关系型数据库的关系描述文件-(NSManagedobjectModel*)managedobjectModel{
  37. if(managedobjectModel!=nil){
  38. returnmanagedobjectModel;}
  39. managedobjectModel=[[NSManagedobjectModelmergedModelFromBundles:nil]retain];//从本地所有xcda*****odel文件得到这个CoreData数据模板
  40. returnmanagedobjectModel;}
  41. //自定义“数据一致性存储器”persistentStoreCoordinator的getter
  42. -(NSPersistentStoreCoordinator*)persistentStoreCoordinator{
  43. if(persistentStoreCoordinator!=nil){returnpersistentStoreCoordinator;
  44. }
  45. //定义一个本地地址到NSURL,用来存储那个sqlite文件NSURL*storeUrl=[NSURLfileURLWithPath:
  46. [[selfapplicationDocumentsDirectory]stringByAppendingPathComponent:@"Locations.sqlite"]];
  47. NSError*error;
  48. persistentStoreCoordinator=[[NSPersistentStoreCoordinatoralloc]initWithManagedobjectModel:[selfmanagedobjectModel]];
  49. //从这里可以看出,其实persistentStoreCoordinator需要的不过是一个//存储数据的位置,它是负责管理CoreData如何储存数据的
  50. if(![persistentStoreCoordinatoraddPersistentStoreWithType:NSsqliteStoreType
  51. configuration:nilURL:storeUrl
  52. options:nilerror:&error]){
  53. //Handletheerror.}
  54. returnpersistentStoreCoordinator;
  55. }
  56. //返回该程序的档案目录,用来简单使用-(Nsstring*)applicationDocumentsDirectory{
  57. NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
  58. NSUserDomainMask,YES);Nsstring*basePath=([pathscount]>0)?[pathsobjectAtIndex:0]:nil;
  59. returnbasePath;//我原来的帖子中介绍过,方法其实是一模一样的
  60. }
  61. -(void)dealloc{
  62. //释放内存[managedobjectContextrelease];
  63. [managedobjectModelrelease];[persistentStoreCoordinatorrelease];
  64. [navigationControllerrelease];
  65. [windowrelease];[superdealloc];
  66. }@end

从上面的程序主代理文件可以看出, 的简单使用不过是通过三个组建。
NSManagedobjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
NSManagedobjectContext来得到被储存内容文件管理器,对数据作直接操作
NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(sqlite)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐