Core Data

前端之家收集整理的这篇文章主要介绍了Core Data前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 我们点击“Create a new Xcode project”来开始我们的Core Data程序工程吧!
  2.  
  3. 屏幕快照 2009-09-01 下午12.06.52
  4.  
  5. 在这里,XCode已经给我们准备好了一个几乎可以直接去用的程序模板,直接选择“基于导航的应用程序”,然后记得点选“Use Core Data for storage
  6.  
  7. 屏幕快照 2009-09-01 下午12.14.03
  8.  
  9. 建立好的程序名为XCDtest01,我们尝试编译运行,看看得到的程序是什么样的:
  10.  
  11. 屏幕快照 2009-09-01 下午12.16.47
  12.  
  13. 基本上来说,这个程序把什么都给我们弄好了,一个程序,在点击添加按钮之后添加现在的时间标签,如果点击“Edit”编辑按钮,就进入编辑模式,可以删除任意条信息。
  14.  
  15. 如果点开xcdatamodel文件,我们可以看到,其中的实体为Event,有一个参数,名为“时间标签”。也就是说,如果我们想对这个列表视图中的数据作更改,只需要适当更改这个实体的参数,并配置- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 代理条目就可以显示适当的内容了。
  16.  
  17. 屏幕快照 2009-09-01 下午12.20.19
  18.  
  19. 这个预置程序与我们之前讨论的程序不同的,在于这个程序中并没有配置一个可变数组(NSMutableArray)来作数据副本,以达到高速存储的目的。因为Core Data在向磁盘和内存操作,NSMutableArray是内存操作,速度上比较有优势。但是我们有的这个小程序太小了,再者苹果有可能认为那种方法是非标准的。所以在这里才没有那么作
  20.  
  21. NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath]; cell.textLabel.text = [[managedObject valueForKey:@"timeStamp"] description];
  22.  
  23. 在这个程序的cell配置代理里面,仅仅是从“获取操作控制器”中得到了“被管理对象”,然后再读取其中的内容celltext中。
  24.  
  25. 希望大家也使用这个模板,自己创建一个Core Data程序,然后简单的理解一下代码。下次我们聊只使用基于Window的程序模板+Core Data来创建程序
  26. CoreData实例分析学习(1)转自 http://c.gzl.name/archives/393
  27.  
  28. 屏幕快照 2009-08-26 下午04.05.29
  29.  
  30. Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来学习吧,接下来使用苹果提供的实例程序Locations来作分析:
  31.  
  32. >程序介绍:
  33.  
  34. 右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController功能添加,编辑,删除功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
  35.  
  36. 首先我们看看该程序的AppDelegate.h
  37.  
  38. @interface LocationsAppDelegate : NSObject
  39.  
  40. {
  41.  
  42. UIWindow *window;
  43.  
  44. UINavigationController *navigationController; //导航栏
  45.  
  46. //以下定义了Core Data的三个决定性组建,等后面m文件里面再多介绍
  47.  
  48. NSPersistentStoreCoordinator *persistentStoreCoordinator;
  49.  
  50. NSManagedObjectModel *managedObjectModel;
  51.  
  52. NSManagedObjectContext *managedObjectContext;
  53.  
  54. }
  55.  
  56. @property (nonatomic,retain) IBOutlet UIWindow *window;
  57.  
  58. @property (nonatomic,retain) UINavigationController *navigationController;
  59.  
  60. - (IBAction)saveAction:sender; //这个没找到作用...根本就没用到IB
  61.  
  62. //还记得吧,nonatomic是因为这个程序是单线程
  63.  
  64. @property (nonatomic,retain,readonly) NSManagedObjectModel *managedObjectModel;
  65.  
  66. @property (nonatomic,readonly) NSManagedObjectContext *managedObjectContext;
  67.  
  68. @property (nonatomic,readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  69.  
  70. @property (nonatomic,readonly) NSString *applicationDocumentsDirectory; //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存sqlite文件的地方
  71.  
  72. @end
  73.  
  74. 从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的CoreData数据的,接下来看m文件也会对此作更多的理解。
  75.  
  76. #import "LocationsAppDelegate.h"
  77.  
  78. #import "RootViewController.h"
  79.  
  80. @implementation LocationsAppDelegate
  81.  
  82. @synthesize window;
  83.  
  84. @synthesize navigationController;
  85.  
  86. - (void)applicationDidFinishLaunching:(UIApplication *)application
  87.  
  88. {
  89.  
  90. //初始化根视图控制器,它是一个列表视图控制器
  91.  
  92. RootViewController *rootViewController = [[RootViewController alloc]
  93.  
  94. initWithStyle:UITableViewStylePlain];
  95.  
  96. //通过下面的自定义getter得到CoreData的“被管理对象内容器”
  97.  
  98. NSManagedObjectContext *context = [self managedObjectContext];
  99.  
  100. if (!context)
  101.  
  102. {
  103.  
  104. // 如果getter出错,在这里来排错
  105.  
  106. }
  107.  
  108. rootViewController.managedObjectContext = context; //rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
  109.  
  110. UINavigationController *aNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
  111.  
  112. self.navigationController = aNavigationController; //初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
  113.  
  114. [window addSubview:[navigationController view]];
  115.  
  116. [window makeKeyAndVisible];
  117.  
  118. //由于导航栏retain了根视图,所以在这里可以release掉它了
  119.  
  120. [rootViewController release];
  121.  
  122. //由于self已经retain了导航栏,所以导航栏可以release
  123.  
  124. [aNavigationController release]; }
  125.  
  126. //applicationWillTerminate: 在程序结束前,Core Data会保存任何对其的更改
  127.  
  128. - (void)applicationWillTerminate:(UIApplication *)application
  129.  
  130. {
  131.  
  132. NSError *error;
  133.  
  134. if (managedObjectContext != nil)
  135.  
  136. {
  137.  
  138. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
  139.  
  140. { // Handle the error. }
  141.  
  142. }
  143.  
  144. }
  145.  
  146. //在得到点击事件后,保存更改
  147.  
  148. - (IBAction)saveAction:(id)sender
  149.  
  150. {
  151.  
  152. NSError *error;
  153.  
  154. if (![[self managedObjectContext] save:&error])
  155.  
  156. { // Handle error }
  157.  
  158. }
  159.  
  160. //自定义的managedObjectContext的getter,它其实是真正在使用的时候的被操作对象
  161.  
  162. - (NSManagedObjectContext *) managedObjectContext
  163.  
  164. {
  165.  
  166. //如果已经有这个对象,就直接返回,否则继续
  167.  
  168. if (managedObjectContext != nil)
  169.  
  170. { return managedObjectContext; }
  171.  
  172. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  173.  
  174. if (coordinator != nil)
  175.  
  176. {
  177.  
  178. managedObjectContext = [[NSManagedObjectContext alloc] init];
  179.  
  180. [managedObjectContext setPersistentStoreCoordinator: coordinator];
  181.  
  182. //这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
  183.  
  184. //managedObjectContext需要得到这个“数据一致性存储器”
  185.  
  186. }
  187.  
  188. return managedObjectContext;
  189.  
  190. }
  191.  
  192. //自定义的CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系,类似于关系型数据库的关系描述文件
  193.  
  194. - (NSManagedObjectModel *)managedObjectModel
  195.  
  196. {
  197.  
  198. if (managedObjectModel != nil)
  199.  
  200. { return managedObjectModel; }
  201.  
  202. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
  203.  
  204. //从本地所有xcdatamodel文件得到这个CoreData数据模板
  205.  
  206. return managedObjectModel;
  207.  
  208. }
  209.  
  210. //自定义“数据一致性存储器” persistentStoreCoordinator的getter
  211.  
  212. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
  213.  
  214. {
  215.  
  216. if (persistentStoreCoordinator != nil)
  217.  
  218. { return persistentStoreCoordinator; }
  219.  
  220. //定义一个本地地址到NSURL,用来存储那个sqlite文件
  221.  
  222. NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Locations.sqlite"]];
  223.  
  224. NSError *error;
  225.  
  226. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
  227.  
  228. initWithManagedObjectModel: [self managedObjectModel]];
  229.  
  230. //从这里可以看出,其实persistentStoreCoordinator需要的不过是一个
  231.  
  232. //存储数据的位置,它是负责管理CoreData如何储存数据的
  233.  
  234. if (![persistentStoreCoordinator addPersistentStoreWithType:NSsqliteStoreType configuration:nil URL:storeUrl options:nil error:&error])
  235.  
  236. { // Handle the error.}
  237.  
  238. return persistentStoreCoordinator;
  239.  
  240. }
  241.  
  242. //返回该程序的档案目录,用来简单使用
  243.  
  244. - (NSString *)applicationDocumentsDirectory
  245.  
  246. {
  247.  
  248. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  249.  
  250. NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
  251.  
  252. return basePath;
  253.  
  254. }
  255.  
  256. - (void)dealloc
  257.  
  258. {
  259.  
  260. //释放内存
  261.  
  262. [managedObjectContext release];
  263.  
  264. [managedObjectModel release];
  265.  
  266. [persistentStoreCoordinator release];
  267.  
  268. [navigationController release];
  269.  
  270. [window release];
  271.  
  272. [super dealloc];
  273.  
  274. } @end
  275.  
  276. 从上面的程序主代理文件可以看出,CoreData的简单使用不过是通过三个组建。
  277.  
  278. NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
  279. NSManagedObjectContext来得到被储存内容文件管理器,对数据作直接操作
  280. NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(sqlite)
  281.  
  282. 你对Core Data理解更多了么?
  283.  
  284. 补一下“实体”的概念,实体也就是Entity,在打开xcdatamodel文件的时候,我们可以看到
  285.  
  286. 屏幕快照 2009-08-26 下午05.08.29
  287.  
  288. 在这里,这个实体叫“Event”,而实体的参数有“创建日期”,“纬度”,“经度”。也就是说,其实这个实体被使用后,我们可以这样理解,实体就是表名,而参数就是列名,然后整个实体就是一张表。当这个Model描述多个实体的关系的时候,就像是一个关系型数据库一样,虽然苹果说“不是!”
  289. CoreData实例分析学习(2)转自 http://c.gzl.name/archives/412
  290.  
  291. 在我们分析了程序主代理文件AppDelegate)之后,我们先来看看一对自动生成文件Event.h/.m
  292.  
  293. @interface Event : NSManagedObject
  294.  
  295. {
  296.  
  297. }
  298.  
  299. @property (nonatomic,retain) NSDate *creationDate;
  300.  
  301. @property (nonatomic,retain) NSNumber *latitude;
  302.  
  303. @property (nonatomic,retain) NSNumber *longitude;
  304.  
  305. @end
  306.  
  307.  
  308.  
  309. #import "Event.h"
  310.  
  311. @implementation Event
  312.  
  313. @dynamic creationDate;
  314.  
  315. @dynamic latitude;
  316.  
  317. @dynamic longitude;
  318.  
  319. @end
  320.  
  321. 从上面我们能看出来,一个实体Event也就会被生成一个NSManagedObject(被管理对象),然后任何accessorgetter都是被动态生成的,我们其实完全不用操任何的心,只需要在xcdatamodel文件里面配置后,点击添加文件添加NSManagedObject文件,就会看到自动感知的类对象,然后生成就可以了。
  322.  
  323. 下面是根视图控制器,是一个列表视图(UITableViewController
  324.  
  325. #import <CoreLocation/CoreLocation.h>
  326.  
  327. @interface RootViewController : UITableViewController <CLLocationManagerDelegate>
  328.  
  329. {
  330.  
  331. //看到是UITableViewController的子类,由于需要使用Core Location,
  332.  
  333. //所以在后面履行其protocal
  334.  
  335. NSMutableArray *eventsArray;
  336.  
  337. NSManagedObjectContext *managedObjectContext; //这个被管理对象内容器就是我们真正对Core Data数据的操作对象
  338.  
  339. CLLocationManager *locationManager; //用来得到地理位置的Core Location对象
  340.  
  341. UIBarButtonItem *addButton; //右上角的添加
  342.  
  343. }
  344.  
  345. @property (nonatomic,retain) NSMutableArray *eventsArray;
  346.  
  347. @property (nonatomic,retain) NSManagedObjectContext *managedObjectContext;
  348.  
  349. @property (nonatomic,retain) CLLocationManager *locationManager;
  350.  
  351. @property (nonatomic,retain) UIBarButtonItem *addButton;
  352.  
  353.  
  354. - (void)addEvent;
  355.  
  356. @end
  357.  
  358.  
  359. #import "RootViewController.h"
  360.  
  361. #import "LocationsAppDelegate.h"
  362.  
  363. #import "Event.h"
  364.  
  365. @implementation RootViewController
  366.  
  367. @synthesize eventsArray,managedObjectContext,addButton,locationManager;
  368.  
  369. - (void)viewDidLoad
  370.  
  371. {
  372.  
  373. [super viewDidLoad];
  374.  
  375. self.title = @"Locations"; //设置列表视图的标题
  376.  
  377. self.navigationItem.leftBarButtonItem = self.editButtonItem; //导航栏左边的编辑按钮
  378.  
  379. addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addEvent)]; //初始化添加按钮,
  380.  
  381. addButton.enabled = NO; //在Core Location初始化之前将其关闭
  382.  
  383. self.navigationItem.rightBarButtonItem = addButton; //把这个添加按钮添加到导航栏右侧
  384.  
  385. // 启动CLocation
  386.  
  387. [[self locationManager] startUpdatingLocation];
  388.  
  389. //初始化一个“获取请求”到我们的实体“Event”
  390.  
  391. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  392.  
  393. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
  394.  
  395. [request setEntity:entity];
  396.  
  397. // 将时间以建立时间排序,最新的在最上
  398.  
  399. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
  400.  
  401. NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor,nil];
  402.  
  403. [request setSortDescriptors:sortDescriptors];
  404.  
  405. [sortDescriptor release];
  406.  
  407. [sortDescriptors release];
  408.  
  409. // 执行“获取”操作,得到一个“可变数组”的拷贝
  410.  
  411. NSError *error = nil;
  412.  
  413. NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
  414.  
  415. if (mutableFetchResults == nil)
  416.  
  417. { //如果结果为空,在这作错误响应 }
  418.  
  419. // 将得到的本地数组赋值到本类的全局数组,然后清理无用的对象
  420.  
  421. [self setEventsArray:mutableFetchResults];
  422.  
  423. [mutableFetchResults release];
  424.  
  425. [request release];
  426.  
  427. }
  428.  
  429.  
  430. - (void)viewDidUnload
  431.  
  432. {
  433.  
  434. // 当视图被卸载后,将以下指针置空
  435.  
  436. self.eventsArray = nil;
  437.  
  438. self.locationManager = nil;
  439.  
  440. self.addButton = nil;
  441.  
  442. }
  443.  
  444. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  445.  
  446. { // 只有一个章节 return 1; }
  447.  
  448. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  449.  
  450. {
  451.  
  452. // 在数组里面有多少个对象,在列表视图就有多少行
  453.  
  454. return [eventsArray count];
  455.  
  456. }
  457.  
  458. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  459.  
  460. // 一个“日期格式化器”(凑合明白就好...)用来以特定的格式创建得到的日期
  461.  
  462. static NSDateFormatter *dateFormatter = nil;
  463.  
  464. if (dateFormatter == nil)
  465.  
  466. {
  467.  
  468. dateFormatter = [[NSDateFormatter alloc] init];
  469.  
  470. [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
  471.  
  472. [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
  473.  
  474. }
  475.  
  476. static NSNumberFormatter *numberFormatter = nil;
  477.  
  478. if (numberFormatter == nil)
  479.  
  480. {
  481.  
  482. numberFormatter = [[NSNumberFormatter alloc] init];
  483.  
  484. [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
  485.  
  486. [numberFormatter setMaximumFractionDigits:3];
  487.  
  488. }
  489.  
  490.  
  491. static NSString *CellIdentifier = @"Cell";
  492.  
  493. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  494.  
  495. if (cell == nil)
  496.  
  497. {
  498.  
  499. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
  500.  
  501. UITableViewCellStyleSubtitle;
  502.  
  503. }
  504.  
  505. // 从数组中得到这个Event对象
  506.  
  507. Event *event = (Event *)[eventsArray objectAtIndex:indexPath.row];
  508.  
  509. cell.textLabel.text = [dateFormatter stringFromDate:[event creationDate]];
  510.  
  511. NSString *string = [NSString stringWithFormat:@"%@,%@",[numberFormatter stringFromNumber:[event latitude]],[numberFormatter stringFromNumber:[event longitude]]];
  512.  
  513. cell.detailTextLabel.text = string;
  514.  
  515. return cell;
  516.  
  517. }
  518.  
  519. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
  520.  
  521. {
  522.  
  523. if (editingStyle == UITableViewCellEditingStyleDelete)
  524.  
  525. { // 删除被惯例对象在索引路径(index path)
  526.  
  527. NSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];
  528.  
  529. [managedObjectContext deleteObject:eventToDelete];
  530.  
  531. // 更新数组和列表视图
  532.  
  533. [eventsArray removeObjectAtIndex:indexPath.row];
  534.  
  535. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
  536.  
  537. // 提交更改到Core Data
  538.  
  539. NSError *error;
  540.  
  541. if (![managedObjectContext save:&error])
  542.  
  543. { // Handle the error. }
  544.  
  545. }
  546.  
  547. }
  548.  
  549. - (void)addEvent
  550.  
  551. {
  552.  
  553. //如果得不到位置,就返回.
  554.  
  555. CLLocation *location = [locationManager location];
  556.  
  557. if (!location)
  558.  
  559. { return; }
  560.  
  561. //建立一个Event实体对象
  562.  
  563. Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
  564.  
  565. //得到经纬度,然后赋值到event对象去
  566.  
  567. CLLocationCoordinate2D coordinate = [location coordinate];
  568.  
  569. [event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];
  570.  
  571. [event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];
  572.  
  573. // 实例里面并没有使用CL的时间标签,因为在模拟器中会是一样的
  574.  
  575. // [event setCreationDate:[location timestamp]];
  576.  
  577. [event setCreationDate:[NSDate date]];
  578.  
  579. //所以现在使用的是现在的时间,而不是得到位置的时候的时间
  580.  
  581. // 保存更改
  582.  
  583. NSError *error;
  584.  
  585. if (![managedObjectContext save:&error])
  586.  
  587. { // Handle the error. }
  588.  
  589. // 将新Event放到最上面,所以添加到0的位置
  590.  
  591. // 然后滚动列表视图到最上面,如果没有那么多的数据是看不出来区别的
  592.  
  593. [eventsArray insertObject:event atIndex:0];
  594.  
  595. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
  596.  
  597. [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
  598.  
  599. [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
  600.  
  601. }
  602.  
  603. - (CLLocationManager *)locationManager
  604.  
  605. {
  606.  
  607. //自定义的CLocation的getter,方便初始化
  608.  
  609. if (locationManager != nil)
  610.  
  611. { return locationManager; }
  612.  
  613. //初始化CL对象,然后设置精准度,然后将代理对象设为本地
  614.  
  615. locationManager = [[CLLocationManager alloc] init];
  616.  
  617. [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
  618.  
  619. [locationManager setDelegate:self]; return locationManager;
  620.  
  621. }
  622.  
  623. //CLocation的一个代理方法,如果成功就开启右侧添加按钮
  624.  
  625. - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
  626.  
  627. {
  628.  
  629. addButton.enabled = YES;
  630.  
  631. }
  632.  
  633. //CLocation的一个代理方法,如果失败了就关闭(disable)右侧添加按钮
  634.  
  635. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
  636.  
  637. {
  638.  
  639. addButton.enabled = NO;
  640.  
  641. }
  642.  
  643. - (void)dealloc
  644.  
  645. {
  646.  
  647. //释放对象
  648.  
  649. [managedObjectContext release];
  650.  
  651. [eventsArray release];
  652.  
  653. [locationManager release];
  654.  
  655. [addButton release];
  656.  
  657. [super dealloc];
  658.  
  659. }
  660.  
  661. @end
  662.  
  663. 从上面的源代码,我们可以看出,
  664. 1,在这里数据并不是每次都由NSManagedContext对象得到,而是由一个数组得出。
  665. 2,数组是一个可变数组,由第一次载入的视图的时候从NSManagedContext中得到
  666. 3,从NSManagedContext对象中得到数据需要使用NSFetchRequest来初始化一个“获取
  667. 4,每次获得新的数据的时候,同时保存到数组和NSManagedContext中,添加后需要对更改进行提交

猜你在找的Sqlite相关文章