加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

coreData 使用分析

发布时间:2020-12-13 00:13:29 所属栏目:百科 来源:网络整理
导读:Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来 学习 吧,接下来 使用 苹果 提供的实例程序Locations来作分析: 程序介绍:
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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读