/*
FBI声明:
必须了解的英文词组
Fetch Request !!!!
MOC !!!!!
Entity !!!
Attribute !!
*/
什么是Managed Object Model
A managed object model represents a data structure.
被管理对象模型即(APP)数据模型结构。在使用CoreData的时候,我们只需把精力放在(被管理)对象上。至于叫它data model, object graph, schema, or data structure
其实是一个意思~
Entities概念
A managed object model is made up of a collection of entity description objects called entities.
我们使用一套Entity
来作为我们设定好的被管理对象模型的描述句柄(即根据这个描述句柄我们可以获取我们的对象模型)。
被管理对象模型可以有一个以上的entities实体。
数据表字段对应实体的属性。好处在于支持对象dot点
语法糖。
Attributes概念
Attributes属性两个重要的概念就是属性名
以及单位
。
Integer 16/32/64
- Integer 16 ranges from –32768 to 32767
- Integer 32 ranges from –2147483648 to 2147483647
- Integer 64 ranges from –9223372036854775808 to 9223372036854775807
选取多少位Integer根据实际业务,毕竟
The bigger a number, the more memory is needed to hold it.
这里要注意的是避免浮点数运算,你可以设定Integer中1
等于业务逻辑中最小单位的1
,这样好处可以避免浮点数运算带来的问题。
Float & Double & Decimal & String & Boolean & Date(略)
Binary Data (暂略)
Transformable (暂略)
Attribute设置
在选中某个Attribute时我们可以在属性面板(Option+Cmd+3)来设置其属性参数。
- Transient 属性表示绝不写入持久层仓库(文件化)。好处在于可以存一个经常变化的属性,可以用到CoreData的撤销与重做。
- Optional 该属性值可选(可以有也可以没有)。当然默认所有的属性都初始化为
optional
。 - Indexed 该属性用来提升当前持久仓库的搜索效率以额外的存储空间作为代价。当然如果你不用来搜索某一个特定的属性,你可以不用设置这个选项。
- Validation 确保写入持久仓库的数值范围(最小-最大值范围内、字符串长度)都是合法的。
It’s generally a good practice to validate data as soon as a user tries to take focus off an input element, such as a UITextfield.
- Reg. Ex. 输入值满足正则模式
- Default 除了transformabley与binary data以外,在初始化的时候生成的默认值。
- Allows External Storage 用来声明允许超大二进制属性值存储在持久层仓库之外。在遇到高清无码图片,音视频的时候推荐使用。这个属性打开的时候CoreData会自动在SQLite之外存储超过1M的数据。
- Index in Spotlight 略
- Store in External Record File 略
- Name 自定义属性专属,用来指定特定的
NSValueTransformer
子类来进行对象转换。
如何创建一个被管理对象
代码片段:
NSArray *newItemNames = [NSArray arrayWithObjects:
@"Apples", @"Milk", @"Bread", @"Cheese", @"Sausages", @"Butter", @"Orange Juice", @"Cereal", @"Coffee", @"Eggs", @"Tomatoes", @"Fish", nil];
for (NSString *newItemName in newItemNames) {
Item *newItem = [NSEntityDescriptioninsertNewObjectForEntityForName:@"Item" inManagedObjectContext:_coreDataHelper.context];
newItem.name = newItemName;
NSLog(@"Inserted New Managed Object for '%@'", newItem.name);
}
从上述代码片段,我们可以归纳下,
- 要创建一个被管理对象,首先我们要知道这个被管理对象的描述句柄也就是上文提到的Entity实体名。
- 其实需要获得当前
moc
,也就是被管理对象的上下文(任何数据脱离了出处就显得苍白无力) 创建接口
[NSEntityDescriptioninsertNewObjectForEntityForName:@"Item" inManagedObjectContext:_coreDataHelper.context];被管理对象具体Property赋值操作
后台SQL可视化操作步骤
- Click Product > Scheme > Edit Scheme....
- Ensure Run Grocery Dude and the Arguments tab is selected.
- Add a new argument by clicking + in the Arguments Passed On Launch section. 4. Enter -com.apple.CoreData.SQLDebug 3 as a new argument and then click OK.
获取被管理对象
场景:我们要从现有的moc中获取我们想要的特定对象。
与SQL语句SELECT
类似。
- 首先我们要知道条件,故需要一个
NSFetchRequest
来限制抓取条件 - 执行抓取API,EX:
[_coreDataHelper.context executeFetchRequest:request error:nil];
抓取对象数组排序
为了让返回的对象数组顺序按照我们所YY的一样。我们需要告知我们的NSFetchRequest
一个排序描述,对于SQL语句类似与ORDER BY
。
EX:
NSSortDescriptor *sort =
[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sort]];
带过滤的抓取请求
使用predicated断言
可以过滤抓取结果。这个东西也是封装在NSFetchRequest对象内。与SQL的WHERE
等价。
EX:
NSPredicate *filter =
[NSPredicate predicateWithFormat:@"name != %@", @"Coffee"]; [request setPredicate:filter];
抓取请求模板(抓取请求UI化,预定义)
优点:UI配置(更容易,更无脑)、相当于代码重用
缺点:只能执行简单(单步)的predicates,复杂的就saygoodbye了
怎么玩:
配置好第一步,然后就是告诉被管理对象来使用我们刚模板化的FetchRquest
。
NSFetchRequest *request =
[[[_coreDataHelper model] fetchRequestTemplateForName:@"Test"] copy];
删除被管理对象
一句话:
在相应的moc
调用deleteObjecth
或者deleteObjects
。