iOS基础教程:iOS-UI-CoreData学习笔记

本文深入解析了CoreData框架,包括其作为数据库管理库的功能、支持的数据存储类型,以及如何通过图形化方式编辑数据模型。文中详细介绍了PersistentStore、DataModel、PersistentStoreCoordinator等核心组件的工作原理。

http://bbs.9ria.com/thread-202544-1-1.html

我目前的理解,CoreData相当于一个综合的数据库管理库,它支持sqlite,二进制存储文件两种形式的数据存储。而CoreData提供了存储管理,包括查询、插入、删除、更新、回滚、会话管理、锁管理等一系列数据库操作。另外,开发者还可以在xcode中使用 .xcdatamodel 扩展名的文件,以图形化的形式编辑数据模型,这里包括了

Entities、Properties、Attributes、Relationships四个概念,这里跟关系型数据库有很大的相似点。

下面来看一下CoreData的框架。
20130108135657_180.jpg 

一次来了解一下 PersistentStore、DataModel、PersistentStoreCoordinator、ManagedObjects、ManagedObjectsContext、FetchRequest 这些概念。


PersistentStore


这个是数据真正存储的地方,CodeData提供了两种存储的选择,分别是sqlite和二进制文件。PersistentStore本身并不是objc类,仅仅是数据存储。


DataModel


对应的objc类为 NSManagedObjectModel,一个典型的应用如:

  1. /** 
  2. Returns the managed object model for the application. 
  3. If the model doesn't already exist, it is created by merging all of the models 
  4. found in the application bundle. 
  5. */ 
  6. - (NSManagedObjectModel *)managedObjectModel { 
  7. if (managedObjectModel != nil) { 
  8. return managedObjectModel; 

  9. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 
  10. return managedObjectModel; 

  11. /**
  12. Returns the managed object model for the application.
  13. If the model doesn't already exist, it is created by merging all of the models
  14. found in the application bundle.
  15. */
  16. - (NSManagedObjectModel *)managedObjectModel {
  17. if (managedObjectModel != nil) {
  18. return managedObjectModel;
  19. }
  20. managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
  21. return managedObjectModel;
  22. }
复制代码

  • 这里用了iPhone开发中典型的laze loading,而

  • managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 

    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];中的nil表示连接项目中所有的 .xcodemodel 文件为一个datamodel,这是一个非常好的方法,把多个entity放在各自的xcodemodel文件中分开管理,然后用这个函数连接起来生成一个datamodel,这样就可以对应一个persistentStore。
PersistentStoreCoordinator

对应的objc类为NSPersistentStoreCoordinator,这个类用来控制对PersistentStore的访问。PersistentStoreCoordinator提供了一些列的高级调用供其他类来使用,对PersistentStore进行读和写。下面看一段典型的代码:

  1. /** 
  2. Returns the persistent store coordinator for the application. 
  3. If the coordinator doesn't already exist, it is created and the application's store 
  4. added to it. 
  5. */ 
  6. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
  7. if (persistentStoreCoordinator != nil) { 
  8. return persistentStoreCoordinator; 

  9. NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
  10. stringByAppendingPathComponent: @"CoreData.sqlite"]]; 
  11. NSError *error; 
  12. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
  13. initWithManagedObjectModel: [self managedObjectModel]]; 
  14. if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
  15. configuration:nil URL:storeUrl options:nil error:&error]) { 
  16. // Handle error 

  17. return persistentStoreCoordinator; 

  18. /**
  19. Returns the persistent store coordinator for the application.
  20. If the coordinator doesn't already exist, it is created and the application's store
  21. added to it.
  22. */
  23. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  24. if (persistentStoreCoordinator != nil) {
  25. return persistentStoreCoordinator;
  26. }
  27. NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
  28. stringByAppendingPathComponent: @"CoreData.sqlite"]];
  29. NSError *error;
  30. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
  31. initWithManagedObjectModel: [self managedObjectModel]];
  32. if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
  33. configuration:nil URL:storeUrl options:nil error:&error]) {
  34. // Handle error
  35. }
  36. return persistentStoreCoordinator;
  37. }
复制代码

这里默认存储形式为sqlite,并且存储文件为CoreData.sqlite,这段代码比较简单,创建了persistentStoreCoordinator实例。 

ManagedObjects

对应的类为NSManagedObject。上面的CoreData框架图中有Entities,Entity定义了数据的结构,但他并不是数据,真正的数据实例是NSManagedObject类或他的子类。

NSManagedObject类支持Key-Value 编码(KVC),像NSDictionary差不多。NSManagedObject提供了valueForKey:和setValue:forKey:用来设置和查询的方法。另外他也提供了对关系操作的方法。

下面是几个典型的代码案例:

  1. NSDate *timeStamp = [managedObject valueForKey:@"timeStamp"]; 

  2. NSDate *timeStamp = [managedObject valueForKey:@"timeStamp"]; 


  3. [managedObject setValue:[NSDate date] forKey:@"timeStamp"]; 
  4. [managedObject setValue:[NSDate date] forKey:@"timeStamp"];
复制代码

[cpp] view plaincopyprint?

另外KVC也支持keypath,如有两个数据entity,一个是Employee,一个事Employer,Employee中有个属性石whereIWork,而这个属性用relationship连接到了对应的Employer,Employer中有个属性石name,这样要查询一个Employer的name,可以用keypath的形式,

whereIWork.name。 

  1. NSString *employerName = [managedObject valueForKeyPath:@"whereIWork.name"]; 
  2. NSString *employerName = [managedObject valueForKeyPath:@"whereIWork
复制代码
ManagedObjectsContext

对应的类为NSManagedObjectsContext。 这个类是一个用户对persistentStore操作的网关,他维护了用户创建或者加载的managed objects。他记录了用户对managed objects的所有改变,以便用来undo或redo,另外当用户要存储现在的managed objects到persistentstore时,只需调用managedObjectsContext的save方法就行了。

每个应用至少需要一个context,当然可以同时存在多个context,比如多线程时,如NSOperationQueue。context并不是线程安全的,因此在这种情况中用户要自己做好安全工作。

下面是一个简单应用实例。

  1. /** 
  2. Returns the managed object context for the application. 
  3. If the context doesn't already exist, it is created and bound to the persistent 
  4. store coordinator for the application. 
  5. */ 
  6. - (NSManagedObjectContext *) managedObjectContext { 
  7. if (managedObjectContext != nil) { 
  8. return managedObjectContext; 

  9. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
  10. if (coordinator != nil) { 
  11. managedObjectContext = [[NSManagedObjectContext alloc] init]; 
  12. [managedObjectContext setPersistentStoreCoordinator: coordinator]; 

  13. return managedObjectContext; 

  14. /**
  15. Returns the managed object context for the application.
  16. If the context doesn't already exist, it is created and bound to the persistent
  17. store coordinator for the application.
  18. */
  19. - (NSManagedObjectContext *) managedObjectContext {
  20. if (managedObjectContext != nil) {
  21. return managedObjectContext;
  22. }
  23. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  24. if (coordinator != nil) {
  25. managedObjectContext = [[NSManagedObjectContext alloc] init];
  26. [managedObjectContext setPersistentStoreCoordinator: coordinator];
  27. }
  28. return managedObjectContext;
  29. }
复制代码

这个代码也比较简单,不做解释了。

FetchRequest(FetchRequestController)

这里重点讲FetchRequestController,其实用户打交道最多的就是这个控制器了。要讲的东西很多,放到下面一篇吧。


原文链接: http://www.lanou3g.com/blog/sort/Developerdiary/page/27
内容概要:本文为《科技类企业品牌传播白皮书》,系统阐述了新闻媒体发稿、自媒体博主种草与短视频矩阵覆盖三大核心传播策略,并结合“传声港”平台的AI工具与资源整合能力,提出适配科技企业的品牌传播解决方案。文章深入分析科技企业传播的特殊性,包括受众圈层化、技术复杂性与传播通俗性的矛盾、产品生命周期影响及2024-2025年传播新趋势,强调从“技术输出”向“价值引领”的战略升级。针对三种传播方式,分别从适用场景、操作流程、效果评估、成本效益、风险防控等方面提供详尽指南,并通过平台AI能力实现资源智能匹配、内容精准投放与全链路效果追踪,最终构建“信任—种草—曝光”三位一体的传播闭环。; 适合人群:科技类企业品牌与市场负责人、公关传播从业者、数字营销管理者及初创科技公司创始人;具备一定品牌传播基础,关注效果可量化与AI工具赋能的专业人士。; 使用场景及目标:①制定科技产品全生命周期的品牌传播策略;②优化媒体发稿、KOL合作与短视频运营的资源配置与ROI;③借助AI平台实现传播内容的精准触达、效果监测与风险控制;④提升品牌在技术可信度、用户信任与市场影响力方面的综合竞争力。; 阅读建议:建议结合传声港平台的实际工具模块(如AI选媒、达人匹配、数据驾驶舱)进行对照阅读,重点关注各阶段的标准化流程与数据指标基准,将理论策略与平台实操深度融合,推动品牌传播从经验驱动转向数据与工具双驱动。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值