coredata与sqlite

本文详细介绍了Core Data是如何对SQLite数据库进行封装的,包括基本流程、类对应关系、建模过程、数据库操作等,并提供了从创建工程到访问数据库的完整步骤。通过Core Data,开发者能够更高效地管理数据库中的表结构、记录以及执行查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. CoreData是对sqlite数据库的一个封装.  
  2.   
  3. sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系.  
  4.   
  5. 这个过程出现了, 表格的结构(schema), 所有表格的结构和相互联系构成整个数据库的模型, 数据库存放的方式(可以是文件或者在内存), 数据库操作, sql语句(主要是查询), 表格里面的记录  
  6.   
  7. 下面将上面说的文字, 跟CoreData的类作个对应:  
  8.   
  9. 表格结构    --> NSEntityDescription  
  10. 数据库中所有表格和他们的联系 -->NSManagedObjectModel  
  11. 数据库存放方式 --> NSPersistentStoreCoordinator  
  12. 数据库操作 --> NSManagedObjectContext  
  13. 查询语句 --> NSFetchRequest  
  14. 表格的记录 --> NSManagedObject  
  15.   
  16. 可能上面的对应关系并非十分严格, 但确实可以帮助理解.  
  17.   
  18. 下面再看看CoreData的类  
  19. NSEntityDescription  
  20. NSManagedObjectModel  
  21.   
  22. NSEntityDescription用来定义表格结构, 所以你就可以理解NSManagedObjectModel中的setEntities:(NSArray *)entities函数大概有什么用了 . 通常, 定义model, 是用文件CoreData.xcdatamodel, 可以图形化的操作. 这类似用nib来创建界面. 
  1. 建个工程, 使用coredata, 模拟器运行之后, 程序对应的document目录出现一个CoreData.sqlite. 可以利用sqlite3命令来查看里面的表格结构  
  2. 用命令行sqlite3 CoreData.sqlite 进入  
  3. >.tables  
  4. ZEVENT        Z_METADATA    Z_PRIMARYKEY  
  5. 可以看到有表格ZEVENT, 对应的CoreData.xcdatamodel文件有名字叫Event的Entity  
  6.   
  7. >.schema ZEVENT  
  8. CREATE TABLE ZEVENT ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZTIMESTAMP TIMESTAMP );  
  9. 对应的Event中有属性timeStamp, 可以看到, 相应的ZEVENT表格中有字段TIMESTAMP  
  10.   
  11. > select * from ZEVENT  
  12. 1|1|1|306295807.974966  
  13. 2|1|1|306295810.981875  
  14. 3|1|1|306295811.982537  
  15. 这表格有三个记录, 可以用来初始化三个NSManagedObject, 修改了NSManagedObject, save之后也修改了表格记录  
  16.   
  17. 你可以在CoreData.xcdatamodel添加新的entity, 之后用sqlit3命令来查看数据库的变化  
  1. NSPersistentStoreCoordinator  
  2. 这个类的对象通常用NSManagedObjectModel的对象来初始化, 这个类抽象出不同的存放方式, 最经常用的是NSSQLiteStoreType.   
  3.   
  4. NSManagedObjectContext  
  5. 这个类的对象又用NSPersistentStoreCoordinator的对象来初始化, 它里面有些方法来添加, 删除NSManagedObject  
  6.   
  7. NSFetchRequest  
  8. 通常用NSEntityDescription来构造查询, 也就指定查询那个表格, 另外可以指定排序.  
  9.   
  10. 在CoreData的设计中, 下一层有相应的属性指向上一层, 所以NSManagedObject有属性得到NSEntityDescription, NSEntityDescription有属性得到NSManagedObjectModel.  
  11.   
  12. CoreData编程使用  
  13. 1:导入CoreData的framework  
  14.   
  15. 2:AppDelegate类的头文件中  
  16. #import <CoreData/CoreData.h>  
  17.    
  18. @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;  
  19. @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;  
  20. @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  21. @property (nonatomic, readonly) NSString *applicationDocumentsDirectory;  
  22.   
  23. 3:在AppDelegate的实现文件中  
  24. @synthesize managedObjectModel;  
  25. @synthesize managedObjectContext;  
  26. @synthesize persistentStoreCoordinator;  
  27. @synthesize applicationDocumentsDirectory;  
  28.   
  29. - (void)dealloc  
  30. {  
  31.     [_window release];  
  32.     [_tabBarController release];  
  33.     [managedObjectModel release];  
  34.     [managedObjectContext release];  
  35.     [persistentStoreCoordinator release];  
  36.     [applicationDocumentsDirectory release];  
  37.     [super dealloc];  
  38. }  
  39. - (NSManagedObjectContext *)managedObjectContext  
  40. {  
  41.     if (managedObjectContext != nil) {  
  42.         return managedObjectContext;  
  43.     }  
  44.       
  45.     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];  
  46.     if (coordinator != nil) {  
  47.         managedObjectContext = [[NSManagedObjectContext alloc] init];  
  48.         [managedObjectContext setPersistentStoreCoordinator:coordinator];  
  49.     }  
  50.       
  51.     return managedObjectContext;  
  52. }  
  53.   
  54. - (NSManagedObjectModel *)managedObjectModel   
  55. {  
  56.     if (managedObjectModel != nil) {  
  57.         return managedObjectModel;  
  58.     }  
  59.       
  60.     //从本地所有xcdatamodel文件中获得这个CoreData的数据模板  
  61.     managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
  62.       
  63.     return managedObjectModel;  
  64. }  
  65.   
  66. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator   
  67. {  
  68.     if (persistentStoreCoordinator != nil) {  
  69.         return persistentStoreCoordinator;  
  70.     }  
  71.       
  72.     NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"TestDB.sqlite"]];//数据库名为TestDB.sqlite  
  73.       
  74.     NSError *error;  
  75.     persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];  
  76.       
  77.       
  78.     if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {  
  79.         NSAssert(0, @"persistentStoreCoordinator init failed!");  
  80.     }  
  81.       
  82.     return persistentStoreCoordinator;  
  83. }  
  84.   
  85. - (NSString *)applicationDocumentsDirectory  
  86. {  
  87.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  88.     NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  89.     return basePath;  
  90. }  
  91. - (void)applicationWillTerminate:(UIApplication *)application  
  92. {  
  93.     /* 
  94.      Called when the application is about to terminate. 
  95.      Save data if appropriate. 
  96.      See also applicationDidEnterBackground:. 
  97.      */  
  98.     NSError *error;  
  99.     if (managedObjectContext != nil) {  
  100.         if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {  
  101.             NSAssert(0, @"save changes failed when terminage application!");  
  102.         }  
  103.     }  
  104. }  
  105.   
  106. 完成上述步骤之后,ViewController类里面就可以访问数据库了。  
  107. 4: 建立数据库模型,如下选择新建文件->Core Data->Data Model  
  108.   
  109. 点击下一步输入上面确定的数据库名:TestDB  
  110. 选中新产生的文件 TestDB.xcdatamodeld,右边的窗口将会变成编辑data model的,如下图点击Add Entity之后输入你要的表名。  
  111.   
  112. 完成之后它将出现在如下图(我这里表名是Event)。选中Event点击上图所示的Add Attribute就可以给表增加字段了。  
  113.   
  114. 当你把表和字段都建立好了之后。在new file,选择第2张图里面的NSManagedObject subclass。一路next下去。编译器将会自动给每张表生成对应的.h和 .m文件,这样数据模型就ok了。  
  115. 5:插入数据  
  116.     CLLocation *location = [locationManager location];  
  117.       
  118.     if (!location) {  
  119.         return;  
  120.     }  
  121.       
  122.     Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];  
  123.       
  124.     CLLocationCoordinate2D coordinate = [location coordinate];  
  125.     [event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];  
  126.     [event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];  
  127.     [event setCreationDate:[NSDate date]];  
  128.       
  129.     NSError *error = nil;  
  130.     if (![managedObjectContext save:&error ]) {  
  131.         // handle error  
  132.     }  
  133. 6:查询数据:  
  134.     eventArray = [[NSMutableArray alloc] init];  
  135.       
  136.     NSFetchRequest *request = [[NSFetchRequest alloc] init];  
  137.     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];  
  138.     [request setEntity:entity];  
  139.     //查询结果排序  
  140.    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];  
  141.     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];  
  142.       
  143.     [request setSortDescriptors:sortDescriptors];  
  144.     [sortDescriptors release];  
  145.     [sortDescriptor release];  
  146.       
  147.       
  148.     NSError *error = nil;  
  149.     //NSMutableArray是一个Event对象的数组,这是有上面那条蓝色语句决定的。  
  150.     NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];  
  151.       
  152.     if (mutableFetchResults == nil) {  
  153.         // Handle the error  
  154.     }  
  155.       
  156.     [self setEventArray:mutableFetchResults];  
  157.     [mutableFetchResults release];  
  158.     [request release];  
  159. 7:删除数据  
  160. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath  
  161. {  
  162.     //删除在indexPath处的managed object  
  163.     if (editingStyle == UITableViewCellEditingStyleDelete) {  
  164.         NSManagedObject *eventToDelete = [eventArray objectAtIndex:indexPath.row];  
  165.         [managedObjectContext deleteObject:eventToDelete];  
  166.     }  
  167.       
  168.     //更新数组和table view  
  169.     [eventArray removeObjectAtIndex:indexPath.row];  
  170.     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath ] withRowAnimation:YES];  
  171.       
  172.     //提交改动  
  173.     NSError *error = nil;  
  174.     if (![managedObjectContext save:&error]) {  
  175.         //handle error  
  176.     }  
  177. }  
  178. 8: 忽略修改  
  179. [managedObjectContext reset];  

更多 1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值