CoreData的冰山一角

最近需要将项目的数据存储模式改为CoreData,所以来总结一下遇到的问题以及解决方法

在使用CoreData前,先在Libraries里导入CoreData.framework

首先是创建模型

Q1:创建Entitles时,如果想要数组或者字典的属性怎么办

  • S1:网上已经有答案,选择Transformable即可,将请求的NSData数据直接放入数据库中,不需要取解Json,在取数据的时候,解析数据即可

  • S2:或者再创建一个实体,进行关联(Relationships),这个方法会比较麻烦,具体看自己的对象关联方式怎么设计,而且需要更多的CoreData知识。比如进行关联的时候,要关注下面这两属性是什么意思,网上也已经有答案了:

##删除关系
NoAction(无操作):当A被删除时,B对象不变,但会指向一个不存在的对象,一般不建议使用;
Nullify(作废):当A对象被删除时,B对象指向的A对象会置为空,如果A与B的关系式一对多,则是A对象从B容器中移除
Cascade(级联):当A对象被删除时,A对象指向的B对象也会被删除;
Deny(拒绝):当删除指向对象B存在的A对象时,操作将会被拒绝;
##对象对应关系
ToMany: 表示一个A对象可以包含多个B对象;
ToOne: 表示一个A对象只能对应一个B对象;
CoreData的冰山一角_第1张图片
关系设置区域

Q2:xcode8以上通过模型create NSManagedObject subclass时默认创建为swift文件,可能会导致项目各种报错

  • S2:先选择模型文件并选择然后找到Language进行修改


    选择模型文件

    找到Language进行修改

Q3:通过模型create NSManagedObject subclass创建实体文件时,默认可能将文件创建到项目最外层目录下

  • S3:貌似是Xcode的一个bug,一定要用Group的那个选项来选择路径,才能在正确地路径下创建
CoreData的冰山一角_第2张图片
路径选择区域

Q4:创建CoreDataManager后,报错:Receiver ‘xxx’ for class message is a forward declaration或者Receiver type ‘xxx’ for instance message is a forward declaration

不明所以的报错,求解
  • S4: 网上查到的貌似是ARC和MRC的原因,但是我是导入#import 就可以了,如果有其他的解决方法,请分享给我

Q5:想要查看CoreData存储的具体log

  • S5:看下图
Edit Scheme
CoreData的冰山一角_第3张图片
找到Run-Arguments,然后下面加入两个字段

Q6:创建一个实体,但是在CoreData创建的数据库中动态创建多张表

  • S6:看到很多大神都是说一个实体一张表,但是我想要实现移动端不同用户建一张表,不同的用户标识不同的表名,同一台手机,当登录A用户的时候读取的是A表,A退出B登录,就读取B表,但是这个貌似是没有很好解决办法的;所以我就只能在在实体再加一个用户标识的字段,每次读取时用NSPredicate来筛选(暂时就这样吧,也许还有很多我不懂的地方,欢迎交流)

----------------------------------------------------------------------------------2017.03.17

Q7:最近又发现一个问题:怎么我用的CoreData老是崩溃,错误信息:[[__NSCFSet addObject:]: attempt to insert nil'],老是断在在save这个方法,我还特意加个判断实体是否为空再来save,可是貌似没什么用;找了一下看到stackoverflow里面还挺多这种情况的,所以我参考了下面这位的方法

CoreData的冰山一角_第4张图片
大神的对话
  • S7:注意创建时用NSPrivateQueueConcurrencyType,大家都试试吧


    创建NSManagedObjectContext

----------------------------------------------------------------------------------2017.04.13

Q8:一不小心又发现一个崩溃问题:returned error Error Domain=NSCocoaErrorDomain Code=134140 "永久性储存转移失败,缺少映射模型。" ,看到有人说是在存储的时候数据类型不一致导致的,我已经查到这个小bug并修复了但是还是报错;reason = "Can't find mapping model for migration"用这个reason去stackoverflow里面也能看到好几个这样的问题但是都是好几年前的,所以我继续找了一下,还是能找到答案的

原来使用的options
后来使用的options
  • S7:options新加了一个键值对:NSInferMappingModelAutomaticallyOption:@YES
    NSMigratePersistentStoresAutomaticallyOption:这个操作表示自动迁移Persistent Store
    NSInferMappingModelAutomaticallyOption这个操作是表示自动创建Mapping Model。
    如果只是使用了NSMigratePersistentStoresAutomaticallyOption:@YES却没有带上NSInferMappingModelAutomaticallyOption:@YES就可能导致像我上面提到的出错。原因可能就是当数据的物理信息发生变化时,PersistentStores会自动创建,但是缺失了MappingModel。MappingModel是为PersistentStores服务的,所以最好一起带上比较安全。
    ----------------------------------------------------------------------------------2017.05.25

你可能感兴趣的:(CoreData的冰山一角)