首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

Core Data浅谈系列之二 : 简略的CURD

2013-07-04 
Core Data浅谈系列之二 : 简单的CURD在上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构

Core Data浅谈系列之二 : 简单的CURD
在上一篇中简单介绍了Core Data Stack,自上而下地对Core Data应用结构有个基本的认识,不过都是理论上的。这里就以上一篇的理论构建起一个可运行的Demo,执行一些简单的增删改查操作。?Core Data浅谈系列之二 : 简略的CURD(图片来自Apple)??首先,我们需要建立如上图的栈结构。因此,在ViewController里添加3个属性:[cpp]?view plaincopy

  1. @interface?ViewController?:?UIViewController??
  2. ??
  3. @property?(nonatomic,?retain)?NSManagedObjectModel?*managedObjectModel;??
  4. @property?(nonatomic,?retain)?NSManagedObjectContext?*managedObjectContext;??
  5. @property?(nonatomic,?retain)?NSPersistentStoreCoordinator?*persistentStoreCoordinator;??
  6. ??
  7. @end??

根据前文讨论的顺序,我们首先创建managedObjectModel(在那之前需要引入CoreData Framework):

[cpp]?view plaincopy
  1. -?(NSManagedObjectModel?*)managedObjectModel??
  2. {??
  3. ????if?(nil?!=?_managedObjectModel)?{??
  4. ????????return?_managedObjectModel;??
  5. ????}??
  6. ??????
  7. ????_managedObjectModel?=?[[NSManagedObjectModel?mergedModelFromBundles:nil]?retain];??
  8. ????return?_managedObjectModel;??
  9. }??
接着创建NSManagedObject的生存环境 —— NSManagedObjectContext:[cpp]?view plaincopy
  1. -?(NSManagedObjectContext?*)managedObjectContext??
  2. {??
  3. ????if?(nil?!=?_managedObjectContext)?{??
  4. ????????return?_managedObjectContext;??
  5. ????}??
  6. ??????
  7. ????_managedObjectContext?=?[[NSManagedObjectContext?alloc]?init];??
  8. ????return?_managedObjectContext;??
  9. }??
由于Demo会将数据存储到本地文件,所以还需要NSPersistentStoreCoordinator和NSManagedObjectContext配合。下面是创建Core Data栈结构的完整代码:[cpp]?view plaincopy
  1. #pragma?mark?-???
  2. #pragma?mark?-?Core?Data?Stack??
  3. ??
  4. -?(NSManagedObjectModel?*)managedObjectModel??
  5. {??
  6. ????if?(nil?!=?_managedObjectModel)?{??
  7. ????????return?_managedObjectModel;??
  8. ????}??
  9. ??????
  10. ????_managedObjectModel?=?[[NSManagedObjectModel?mergedModelFromBundles:nil]?retain];??
  11. ????return?_managedObjectModel;??
  12. }??
  13. ??
  14. -?(NSManagedObjectContext?*)managedObjectContext??
  15. {??
  16. ????if?(nil?!=?_managedObjectContext)?{??
  17. ????????return?_managedObjectContext;??
  18. ????}??
  19. ??????
  20. ????_managedObjectContext?=?[[NSManagedObjectContext?alloc]?init];??
  21. ??????
  22. ????if?(self.persistentStoreCoordinator)?{??
  23. ????????[_managedObjectContext?setPersistentStoreCoordinator:self.persistentStoreCoordinator];??
  24. ????}??
  25. ??????
  26. ????return?_managedObjectContext;??
  27. }??
  28. ??
  29. -?(NSPersistentStoreCoordinator?*)persistentStoreCoordinator??
  30. {??
  31. ????if?(nil?!=?_persistentStoreCoordinator)?{??
  32. ????????return?_persistentStoreCoordinator;??
  33. ????}??
  34. ??????
  35. ????NSString?*storeType?=?NSSQLiteStoreType;??
  36. ????NSString?*storeName?=?@"cdNBA.sqlite";??
  37. ??????
  38. ????NSError?*error?=?NULL;??
  39. ????NSURL?*storeURL?=?[NSURL?fileURLWithPath:[[self?applicationDocumentsDirectory]?stringByAppendingPathComponent:storeName]];??
  40. ??????
  41. ????_persistentStoreCoordinator?=?[[NSPersistentStoreCoordinator?alloc]?initWithManagedObjectModel:self.managedObjectModel];??
  42. ????if?(![_persistentStoreCoordinator?addPersistentStoreWithType:storeType?configuration:nilURL:storeURL?options:nil?error:&error])?{??
  43. ????????NSLog(@"Error?:?%@\n",?[error?localizedDescription]);??
  44. ????????NSAssert1(YES,?@"Failed?to?create?store?%@?with?NSSQLiteStoreType",?[storeURL?path]);??
  45. ????}??
  46. ??????
  47. ????return?_persistentStoreCoordinator;??
  48. }??
  49. ??
  50. #pragma?mark?-??
  51. #pragma?mark?Application's?Documents?Directory??
  52. ??
  53. -?(NSString?*)applicationDocumentsDirectory??
  54. {??
  55. ????NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
  56. ????NSString?*basePath?=?([paths?count]?>?0)???[paths?objectAtIndex:0]?:?nil;??
  57. ????return?basePath;??
  58. }??

在搭建完基础的Core Data栈结构后,就可以写一些简单的CURD代码了:

[cpp]?view plaincopy
  1. #pragma?mark?-???
  2. #pragma?mark?-?CURD?Operations??
  3. ??
  4. -?(BOOL)createTeamWithName:(NSString?*)teamName?city:(NSString?*)teamCity??
  5. {??
  6. ????if?(!teamName?||?!teamCity)?{??
  7. ????????return?NO;??
  8. ????}??
  9. ??????
  10. ????NSManagedObject?*teamObject?=?[NSEntityDescription?insertNewObjectForEntityForName:@"Team"?inManagedObjectContext:self.managedObjectContext];??
  11. ????[teamObject?setValue:teamName?forKey:@"name"];??
  12. ????[teamObject?setValue:teamCity?forKey:@"city"];??
  13. ??????
  14. ????return?YES;??
  15. }??
  16. ??
  17. -?(NSArray?*)fetchTeamList??
  18. {??
  19. ????NSFetchRequest?*fetchRequest?=?[[NSFetchRequest?alloc]?init];??
  20. ????[fetchRequest?setEntity:[NSEntityDescription?entityForName:@"Team"?inManagedObjectContext:self.managedObjectContext]];??
  21. ??????
  22. ????NSError?*error?=?NULL;??
  23. ????NSArray?*array?=?[self.managedObjectContext?executeFetchRequest:fetchRequest?error:&error];??
  24. ????if?(error)?{??
  25. ????????NSLog(@"Error?:?%@\n",?[error?localizedDescription]);??
  26. ????}??
  27. ??????
  28. ????[fetchRequest?release],?fetchRequest?=?nil;??
  29. ??????
  30. ????return?array;??
  31. }??

我们可以把读写的代码放到viewDidLoad函数中:

[cpp]?view plaincopy
  1. -?(void)viewDidLoad??
  2. {??
  3. ????[superviewDidLoad];??
  4. //?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.??
  5. ??????
  6. ????[self?createTeamWithName:@"Heat"city:@"Miami"];??
  7. ????[self?createTeamWithName:@"Lakers"city:@"LA"];??
  8. ????[self?saveContext];??
  9. ??????
  10. ????NSArray?*teamArray?=?[self?fetchTeamList];??
  11. ????if?(teamArray)?{??
  12. ????????for?(NSManagedObject?*teamObject?in?teamArray)?{??
  13. ????????????NSString?*teamName?=?[teamObject?valueForKey:@"name"];??
  14. ????????????NSString?*teamCity?=?[teamObject?valueForKey:@"city"];??
  15. ????????????NSLog(@"Team?info?:?%@,?%@\n",?teamName,?teamCity);??
  16. ????????}??
  17. ????}??
  18. }??

由于在context中创建的对象只是存在于内存中,所以我们还需要显式地把数据保存到sqlite文件里:

[cpp]?view plaincopy
  1. #pragma?mark?-??
  2. #pragma?mark?-?Save?Context??
  3. ??
  4. -?(void)saveContext??
  5. {??
  6. ????NSError?*error?=?NULL;??
  7. ????NSManagedObjectContext?*moc?=?self.managedObjectContext;??
  8. ????if?(moc?&&?[moc?hasChanges]?&&?![moc?save:&error])?{??
  9. ????????NSLog(@"Error?%@,?%@",?error,?[error?localizedDescription]);??
  10. ????????abort();??
  11. ????}??
  12. }??
最后,就是跑一下Demo,检验一下结果。执行过一次程序后,我们可以搜索下cdNBA.sqlite文件,然后查看里面的数据:??Core Data浅谈系列之二 : 简略的CURD
?同时,控制台也输出了数据:[plain]?view plaincopy
  1. 2013-01-16?14:32:52.638?cdNBA[4717:c07]?Team?info?:?Heat,?Miami??
  2. 2013-01-16?14:32:52.639?cdNBA[4717:c07]?Team?info?:?Lakers,?LA??

热点排行