Posted By

iswear_wxp on 04/01/10


Tagged

coredata


Versions (?)

Who likes this?

1 person have marked this snippet as a favorite

adison


CoreData实例分析学习(1)


 / Published in: iPhone
 

URL: http://c.gzl.name/archives/393

  1. Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来学习吧,接下来使用苹果提供的实例程序Locations来作分析:
  2.  
  3. >程序介绍:
  4.  
  5. 右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能来添加,编辑,删除等功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
  6.  
  7. 首先我们看看该程序的AppDelegate.h
  8.  
  9. @interface LocationsAppDelegate : NSObject {
  10. UIWindow *window;
  11. UINavigationController *navigationController; //导航栏
  12.  
  13. //以下定义了Core Data的三个决定性组建,等后面m文件里面再多介绍
  14. NSPersistentStoreCoordinator *persistentStoreCoordinator;
  15. NSManagedObjectModel *managedObjectModel;
  16. NSManagedObjectContext *managedObjectContext;
  17. }
  18.  
  19. @property (nonatomic, retain) IBOutlet UIWindow *window;
  20. @property (nonatomic, retain) UINavigationController *navigationController;
  21.  
  22. - (IBAction)saveAction:sender; //这个没找到作用...根本就没用到IB
  23.  
  24. //还记得吧,nonatomic是因为这个程序是单线程
  25. @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
  26. @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
  27. @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator
  28. *persistentStoreCoordinator;
  29. @property (nonatomic, readonly) NSString *applicationDocumentsDirectory;
  30. //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存SQLite文件的地方
  31. @end
  32.  
  33. 从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的CoreData数据的,接下来看m文件也会对此作更多的理解。
  34.  
  35. #import "LocationsAppDelegate.h"
  36. #import "RootViewController.h" //该程序使用了一个根视图控制器,所以导入了这个类
  37. @implementation LocationsAppDelegate
  38. @synthesize window;
  39. @synthesize navigationController;
  40.  
  41. - (void)applicationDidFinishLaunching:(UIApplication *)application {
  42. //初始化根视图控制器,它是一个列表视图控制器
  43. RootViewController *rootViewController = [[RootViewController alloc]
  44. initWithStyle:UITableViewStylePlain];
  45.  
  46. //通过下面的自定义getter得到CoreData的“被管理对象内容器”
  47. NSManagedObjectContext *context = [self managedObjectContext];
  48. if (!context) {
  49. // 如果getter出错,在这里来排错
  50. }
  51. rootViewController.managedObjectContext = context;
  52. //rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
  53.  
  54. UINavigationController *aNavigationController = [[UINavigationController alloc]
  55. initWithRootViewController:rootViewController];
  56. self.navigationController = aNavigationController;
  57. //初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
  58. [window addSubview:[navigationController view]];
  59. [window makeKeyAndVisible];
  60.  
  61. //由于导航栏retain了根视图,所以在这里可以release掉它了
  62. [rootViewController release];
  63. //由于self已经retain了导航栏,所以导航栏可以release
  64. [aNavigationController release];
  65. }
  66.  
  67. //applicationWillTerminate: 在程序结束前,Core Data会保存任何对其的更改
  68. - (void)applicationWillTerminate:(UIApplication *)application {
  69.  
  70. NSError *error;
  71. if (managedObjectContext != nil) {
  72. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
  73. // Handle the error.
  74. }
  75. }
  76. }
  77.  
  78. //在得到点击事件后,保存更改
  79. - (IBAction)saveAction:(id)sender {
  80.  
  81. NSError *error;
  82. if (![[self managedObjectContext] save:&error]) {
  83. // Handle error
  84. }
  85. }
  86.  
  87. //自定义的managedObjectContext的getter, 它其实是真正在使用的时候的被操作对象
  88. - (NSManagedObjectContext *) managedObjectContext {
  89.  
  90. //如果已经有这个对象,就直接返回,否则继续
  91. if (managedObjectContext != nil) {
  92. return managedObjectContext;
  93. }
  94.  
  95. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  96. if (coordinator != nil) {
  97. managedObjectContext = [[NSManagedObjectContext alloc] init];
  98. [managedObjectContext setPersistentStoreCoordinator: coordinator];
  99. //这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
  100. //managedObjectContext需要得到这个“数据一致性存储器”
  101. }
  102. return managedObjectContext;
  103. }
  104.  
  105. //自定义的CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系
  106. //,类似于关系型数据库的关系描述文件
  107. - (NSManagedObjectModel *)managedObjectModel {
  108.  
  109. if (managedObjectModel != nil) {
  110. return managedObjectModel;
  111. }
  112. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
  113. //从本地所有xcdatamodel文件得到这个CoreData数据模板
  114. return managedObjectModel;
  115. }
  116.  
  117. //自定义“数据一致性存储器” persistentStoreCoordinator的getter
  118. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  119.  
  120. if (persistentStoreCoordinator != nil) {
  121. return persistentStoreCoordinator;
  122. }
  123.  
  124. //定义一个本地地址到NSURL,用来存储那个SQLite文件
  125. NSURL *storeUrl = [NSURL fileURLWithPath:
  126. [[self applicationDocumentsDirectory]
  127. stringByAppendingPathComponent: @"Locations.sqlite"]];
  128.  
  129. NSError *error;
  130. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
  131. initWithManagedObjectModel: [self managedObjectModel]];
  132. //从这里可以看出,其实persistentStoreCoordinator需要的不过是一个
  133. //存储数据的位置,它是负责管理CoreData如何储存数据的
  134. if (![persistentStoreCoordinator
  135. addPersistentStoreWithType:NSSQLiteStoreType
  136. configuration:nil
  137. URL:storeUrl
  138. options:nil
  139. error:&error]) {
  140. // Handle the error.
  141. }
  142.  
  143. return persistentStoreCoordinator;
  144. }
  145.  
  146. //返回该程序的档案目录,用来简单使用
  147. - (NSString *)applicationDocumentsDirectory {
  148.  
  149. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
  150. NSUserDomainMask, YES);
  151. NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
  152. return basePath;
  153. //我原来的帖子中介绍过,方法其实是一模一样的
  154. }
  155.  
  156. - (void)dealloc {
  157.  
  158. //释放内存
  159. [managedObjectContext release];
  160. [managedObjectModel release];
  161. [persistentStoreCoordinator release];
  162.  
  163. [navigationController release];
  164. [window release];
  165. [super dealloc];
  166. }
  167. @end
  168.  
  169. 从上面的程序主代理文件可以看出,CoreData的简单使用不过是通过三个组建。
  170.  
  171. NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
  172. NSManagedObjectContext来得到被储存内容的文件管理器,对数据作直接操作
  173. NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(SQLite)

Report this snippet  

You need to login to post a comment.