如何设置核心数据的轻量级迁移使用ios magicalrecordd

MagicalRecord的使用 - 简书
下载简书移动应用
写了22331字,被26人关注,获得了31个喜欢
MagicalRecord的使用
快过年了,最近都很闲,用MagicalRecord这个第三方库已经两年了,之前都没有写些什么记录的,现在把它的基本用法稍微写写,主要是增删改查的功能,如果想打造成一个完善的数据库轮子给自己项目用或公司内部用的话,可以在这个第三方库基础上再封装一层,我之前做的兔兔助手的项目就是在它的基础上封装一层。这个第三方库功能真的很强大,又简单。如果想给别人用,又不想别人知道你实现原理的话,你可以打个静态库啥的,这样别人就不知道你怎么封装了,说不定还不知道你使用了这个第三方库呢。插个小段,据说MagicalRecord的缔造者Saul Mora大神来到中国工作了,貌似在微信团队,不知道是不是真的。
使用CoreData时会用到许多引用代码,让工作变得很复杂,MagicalRecord可以帮你解决这些问题。MagicalRecord的目标是清除CoreData引用的代码,允许在需要请求优化的时候修改NSFetchRequest。还有一款挺好用的数据库,Realm,这里就不说它了。目前接触到的数据库有MySql,Microsoft SQL Server, Oracle, Sqlite3, CoreData, MongoDB。
以前是直接在github上下载下来手动添加的,自从前年用了cocoaPods之后,几乎所有第三方库都是在cocoaPods中自动生成了,简直太方便了。PS:官方文档:
1.现在直接拷贝pod 'MagicalRecord', '~& 2.3.2'这个到Podfile文件中就行了。
2.为项目添加CoreData FrameWork。(点击工程根节点,然后依次Targets & Build Phases & Link Binary With Libraries & + & CoreData.framework & Add)。
3.添加Magical Record的头文件到"你的项目名"-Prefix.pch中。#import &MagicalRecord/MagicalRecord.h&
4.创建模型文件:下面创建一个名为Person的模型,有age、firstName、lastName三个字段。
4.1、创建一个名为Model的模型文件。 (File & New File… & Core Data & Data Model),这个例子创建一个Person.xcdatamodeld。
4.2、点击左下角的Add Entity,更改Entity的名字为Person。
4.3、为Entity添加三个Attribute:age(Integer16)、firstName(string)、lastName(string)。
4.4、点击Editor & Create NSManagedObject Subclass… & Create创建模型文件对应的类。
现在就可以开始MagicalRecord的增删改查操作了。首先在AppDelagate.m中初始化MagicalRecord。
// 对Magical Record的初始化
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"User.sqlite"];
// 创建记录
- (void)createData {
Person *person = [Person MR_createEntity];
person.firstName = @"张";
person.lastName = @"三";
person.age = @25;
[[NSManagedObjectContext MR_defaultContext]
MR_saveToPersistentStoreAndWait];
// 查询记录
- (void)findData {
// 查找数据库中的所有数据
NSArray *person = [Person MR_findAll];
// 查找所有的Person并按照firstName排序
NSArray *personSorted = [Person MR_findAllSortedBy:@"firstName" ascending:YES];
// 查找所有的age属性为25的Person记录
NSArray *personAgeEqual25 = [Person MR_findByAttribute:@"age" withValue:[NSNumber numberWithInt:25]];
// 查找数据库中的第一条记录
Person *personFirst = [Person MR_findFirst];
NSLog(@"%@
%@", person, personSorted, personAgeEqual25, personFirst);
// 查找数据库中的第一条记录的全名
personFirst = [Person MR_findFirst];
NSLog(@"personName:%@%@", personFirst.firstName, personFirst.lastName);
// 更新记录
- (void)updateData {
NSArray *personArr = [Person MR_findByAttribute:@"age" withValue:
[NSNumber numberWithInt:25]];
NSEnumerator *keyE
keyEnumerator = [personArr objectEnumerator];
while (person = [keyEnumerator nextObject]) {
person.firstName = @"李";
for (Person *person in personArr) {
person.lastName = @"四";
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
// 删除记录
- (void)deleteData {
NSArray *personArr = [Person MR_findByAttribute:@"age" withValue:
[NSNumber numberWithInt:25]];
for (Person *person in personArr) {
[person MR_deleteEntity];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
Option: 如果你在使用MagicalRecord方法的时候不想带MR_ 前缀,e.g. 直接用findAll 代替 MR_findAll,就在.pch中在&MagicalRecord/MagicalRecord.h&之前增加#define MR_SHORTHAND 即可。源码中,使用了runtime机制中的swizzle来实现MR_前缀的替换。
就讲了一些基本用法,其他的东东就不说了,基本上就是这些常用的功能了,剩下的就慢慢斟酌了。不得不说NSManagedObject+MagicalFinders.m这个文件的功能相当强大,接下来可以随便造数据库的轮子了。之所以用这个库,第一是这位大神写的太好了,第二是CoreData的多线程问题确实难搞,而这个库我们就很方便地使用了。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
iOS开发相关
· 87人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:MagicalRecord&
注意:& MagicalRecord 在 ARC 下运作,Core Data 是 ORM 方案,据说带来的麻烦比好处多,且 Core Data 建立的表没有主键,但对于对数据库没有性能要求,进行简单的数据操作完全够用,能简化无数的代码量.
MagicalRecord
In software engineering, the active record pattern is a design pattern found in software that stores its data in relational databases. It was named by Martin Fowler in his book Patterns of Enterprise Application Architecture. The interface to such an object would include functions such as Insert, Update, and Delete, plus properties that correspond more-or-less directly to the columns in the underlying database table.
在软件工程中,对象与数据库中的记录实时映射是一种设计模式,在处理关系型数据库的的软件中多有出现.这种设计模式被记录在 Martin Fowler 的&Patterns of Enterprise Application Architecture& 中.被操作对象的接口应该包含增删改查的方法,基本属性不多不少的刚好与数据库中的一条记录相对应.
Active record is an approach to accessing data in a database. A database table or view is
thus an object instance is tied to a single row in the table. After creation of an object, a new row is added to the table upon save. Any object loaded gets its informati when an object is updated, the corresponding row in the table is also updated. The wrapper class implements accessor methods or properties for each column in the table or view.
实时映射记录是一种操作数据库的方式,一个数据库的表被封装成一个对象;这个对象中的一个实例会对应着该表中的一条记录.当创建一个对象时,一条记录也被插入到表中并保存起来.任何被加载的对象中的属性信息都从数据库中读取;当一个对象更新时,这个数据库表中对应的记录也会更新.这个被封装的类实现了实时操作的方法,且其属性一一对应于数据库中表的属性.
- Wikipedia
MagicalRecord was inspired by the ease of Ruby on Rails' Active Record fetching. The goals of this code are:
Clean up my Core Data related code
Allow for clear, simple, one-line fetches
Still allow the modification of the NSFetchRequest when request optimizations are needed
MagicalRecord 灵感来自于简洁的Ruby语言中 Rails' Active Record 查询方式. MagicalRecord 这个开源库的核心思想是:
清除 Core Data 相关的代码
简洁的清除,简单的一行搜索记录的功能
当然允许使用NSFetchRequest,当存在着复杂的搜索条件时
拙劣的翻译请勿见怪,以下是我在最新的 Xcode 5.1 开 ARC 的环境下的使用教程.
1. 将 MagicalRecord 文件夹拖入到工程文件中,引入 CoreData.frame 框架
2. 在 .pch 文件中引入头文件 CoreData+MagicalRecord.h
注:只能在.pch文件中引头文件,否则无法通过编译
3. 创建 Model.xcdatamodeld 文件,并创建一个 Student 的 ENTITIES,最后创建出 Student 类
4. 在 Appdelete.m 文件中写以下代码
以下是增删改查的基本操作,但注意一点,在做任何的数据库操作之前,请先初始化以下,在Appdelete载入时初始化一次即可,否则找不到数据库而崩溃,你懂的.
&&& //设置数据库名字&&& [MagicalRecord setupCoreDataStackWithStoreNamed:@"Model.sqlite"];
增加一条记录&&& Student *person = [Student MR_createEntity];&&& person.name = @"Y.X.";&&& [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
注意:创建了对象后是需要执行存储操作的
查询所有的记录
&&& NSArray *students = [Student MR_findAll];
根据某个属性某个条件查询
&&& NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Y.X."];
根据排序取得搜索结果
&&& NSArray *students = [Student MR_findAllSortedBy:@"name" ascending:YES];
我不一一列举了,查看一下头文件就知道了.
查询所有记录
+ (NSArray *) MR_findA
根据上下文句柄查询所有记录+ (NSArray *) MR_findAllInContext:(NSManagedObjectContext *)
根据某个属性排序查询所有记录+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)
根据某个属性排序以及上下文操作句柄查询所有记录+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)
根据某个属性排序用谓词来查询记录+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchT
根据某个属性排序以及上下文操作句柄用谓词来查询记录+ (NSArray *) MR_findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)
根据谓词查询+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchT
根据谓词以及上下文操作句柄来查询+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)
以下都是查询一个对象时的操作,与上面重复,不一一赘述+ (instancetype) MR_findF+ (instancetype) MR_findFirstInContext:(NSManagedObjectContext *)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchT+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)attributes inContext:(NSManagedObjectContext *)+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending andRetrieveAttributes:(id)attributes, ...;+ (instancetype) MR_findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context andRetrieveAttributes:(id)attributes, ...;+ (instancetype) MR_findFirstByAttribute:(NSString *)attribute withValue:(id)searchV+ (instancetype) MR_findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)+ (instancetype) MR_findFirstOrderedByAttribute:(NSString *)attribute ascending:(BOOL)+ (instancetype) MR_findFirstOrderedByAttribute:(NSString *)attribute ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)
&&& NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Y.X."];&&& for (Student *tmp in students) {&&&&&&& tmp.name = @"Jane";&&& }&&& [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
注意:既然要修改首先得需要找到记录,根据条件匹配找到记录,然后修改,然后保存
&&& NSArray *students = [Student MR_findByAttribute:@"name" withValue:@"Frank"];&&& for (Student *tmp in students) {&&&&&&& [tmp MR_deleteEntity];&&& }&&& [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];&
注意:既然要删除首先得需要找到记录,根据条件匹配找到记录,然后删除,然后保存
如果项目中对于操作数据库没有性能要求请使用 CoreData 相关的开源库吧.
CoreData 操作较为复杂, MagicalRecord 有着很多的特性,比如可以根据设置在主线程或者子线程中进行操作,方便快捷,能入榜最佳10大开源库自有其独到的地方,会使用 MagicalRecord 需要具备一定的 CoreData 相关知识,本人也只是现学现用,但深知其可以为开发带来的好处,使用数据库的朋友有着如下的一些选择.
1. SQLite3&&&&&&&& & &&&&& C函数形式(本人之前做过干嵌入式开发,即使是这样也不推荐使用面向过程毫无对象概念的SQLite3,有更好的方式为什么不用呢?)
2. FMDB&&&&& & & & & & & & 对SQLite3的封装,有着对象的概念,熟悉SQ语句的朋友可以使用,但还没有做到对象与记录实时对应
3. CoreData&&&&&& &&&&&& 他做到了对象与记录实时对应关系,使用其自身的搜索体系(不用SQ语言),但其基本的操作以及配置让人望而却步
4. MagicalRecord& &&& 对 CoreData 官方的用法进行了人性化的封装,用过 CoreData 基本操作再使用 MagicalRecord 会深有体会
5. ObjectiveRecord&& 也是对 CoreData 的人性化封装,使用更加傻瓜,但傻瓜的代价就是牺牲了一些更强大的功能,在Github上搜索关键字即可
1.默认的就是在后台存储的,不会阻塞主线程
我在 CoreData+MagicalRecord.h 文件中定义了宏 MR_SHORTHAND ,所以在方法中不需要 MR_ 前缀了
以下为代码(提供block来通知存储成功,异步操作)
以下为打印信息
----------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------
2.如何关闭 MagicalRecord 提供的打印信息?
修改 MagicalRecord.h 23 行处的值,把 0 改为 1 即可.
阅读(...) 评论()认识CoreData-MagicalRecord
招聘信息:
投稿文章,作者:刘小壮()导读:正文:到目前为止,已经将CoreData相关的知识点都讲完了。在这篇文章中,主要讲一个CoreData第三方库-MagicalRecord。目前为止这个第三方在Github上有9500+的Star,是所有CoreData第三方库中使用最多、功能最全的。在文章的后面还会对CoreData做一个总结,以及对本系列所有文章做一个总结。文章中如有疏漏或错误,还请各位及时提出,谢谢!MagicalRecordCoreData是苹果自家推出的一个持久化框架,使用起来更加面向对象。但是在使用过程中会出现大量代码,而且CoreData学习曲线比较陡峭,如果掌握不好,在使用过程中很容易造成其他问题。国外开发者开源了一个基于CoreData封装的第三方——MagicalRecord,就像是FMDB封装SQLite一样,MagicalRecord封装的CoreData,使得原生的CoreData更加容易使用。并且MagicalRecord降低了CoreData的使用门槛,不用去手动管理之前的PSC、MOC等对象。根据Github上MagicalRecord的官方文档,MagicalRecord的优点主要有三条:1. 清理项目中CoreData代码2. 支持清晰、简单、一行式的查询操作3. 当需要优化请求时,可以获取NSFetchRequest进行修改添加MagicalRecord到项目中将MagicalRecord添加到项目中,和使用其他第三方一样,可以通过下载源码和CocoaPods两种方式添加。1. 从Github下载,将源码直接拖到项目中,后续需要手动更新源码。2. 也可以通过CocoaPods安装MagicalRecord,需要在Podfile中加入下面命令,后续只需要通过命令来更新。pod&"MagicalRecord"在之前创建新项目时,通过勾选"Use Core Data"的方式添加CoreData到项目中,会在AppDelegate文件中生成大量CoreData相关代码。如果是大型项目,被占用的位置是很重要的。而对于MagicalRecord来说,只需要两行代码即可。-&(BOOL)application:(UIApplication&*)application&didFinishLaunchingWithOptions:(NSDictionary&*)launchOptions&{
//&初始化CoreData堆栈,也可以指定初始化某个CoreData堆栈
[MagicalRecord&setupCoreDataStack];
return&YES;
-&(void)applicationWillTerminate:(UIApplication&*)application&{
//&在应用退出时,应该调用cleanUp方法
[MagicalRecord&cleanUp];
}MagicalRecord是支持CoreData的.xcdatamodeld文件的,使得CoreData这一优点可以继续使用。建立数据结构时还是像之前使用CoreData一样,通过.xcdatamodeld文件的方式建立。模型文件支持iCloudCoreData是支持iCloud的,MagicalRecord对iCloud相关的操作也做了封装,只需要使用MagicalRecord+iCloud.h类中提供的方法,就可以进行iCloud相关的操作。例如下面是MagicalRecord+iCloud.h中的一个方法,需要将相关参数传入即可。+ (void)setupCoreDataStackWithiCloudContainer:(NSString *)containerID localStoreNamed:(NSString *)localS创建上下文MagicalRecord对上下文的管理和创建也比较全面,下面是MagicalRecord提供的部分创建和获取上下文的代码。因为是给NSManagedObjectContext添加的Category,可以直接用NSManagedObjectContext类调用,使用非常方便。但是需要注意,虽然系统帮我们管理了上下文对象,对于耗时操作仍然要放在后台线程中处理,并且在主线程中进行UI操作。+ [NSManagedObjectContext MR_context] &设置默认的上下文为它的父级上下文,并发类型为NSPrivateQueueConcurrencyType+ [NSManagedObjectContext MR_newMainQueueContext] &创建一个新的上下文,并发类型为NSMainQueueConcurrencyType+ [NSManagedObjectContext MR_newPrivateQueueContext] &创建一个新的上下文,并发类型为NSPrivateQueueConcurrencyType+ [NSManagedObjectContext MR_contextWithParent:] &创建一个新的上下文,允许自定义父级上下文,并发类型为NSPrivateQueueConcurrencyType+ [NSManagedObjectContext MR_contextWithStoreCoordinator:] &创建一个新的上下文,并允许自定义持久化存储协调器,并发类型为NSPrivateQueueConcurrencyType+ [NSManagedObjectContext MR_defaultContext] &获取默认上下文对象,项目中最基础的上下文对象,并发类型是NSMainQueueConcurrencyType增删改查MagicalRecord对NSManagedObject添加了一个Category,将增删改查等操作放在这个Category中,使得这些操作可以直接被NSManagedObject类及其子类调用。.1. 增对于托管模型的创建非常简单,不需要像之前还需要进行上下文的操作,现在这都是MagicalRecord帮我们完成的。//&创建并插入到上下文中
Employee&*emp&=&[Employee&MR_createEntity];.2. 删//&从上下文中删除当前对象
[emp&MR_deleteEntity];.3. 改//&获取一个上下文对象
NSManagedObjectContext&*defaultContext&=&[NSManagedObjectContext&MR_defaultContext];
//&在当前上下文环境中创建一个新的Employee对象
Employee&*emp&=&[Employee&MR_createEntityInContext:defaultContext];
emp.name&&&&&&=&@"lxz";
emp.brithday&&=&[NSDate&date];
emp.height&&&&=&@1.7;
//&保存修改到当前上下文中
[defaultContext&MR_saveToPersistentStoreAndWait];.4. 查//&执行查找操作,并设置排序条件
NSArray&*empSorted&=&[Employee&MR_findAllSortedBy:@"height"&ascending:YES];自定义NSFetchRequest下面示例代码中,Employee根据已有的employeeFilter谓词对象,创建了employeeRequest请求对象,并将请求对象做修改后,从MOC中获取请求结果,实现自定义查找条件。NSPredicate&*employeeFilter&=&[NSPredicate&predicateWithFormat:@"name&LIKE&%@",&@"*lxz*"];
NSFetchRequest&*employeeRequest&=&[Employee&MR_requestAllWithPredicate:employeeFilter];
employeeRequest.fetchOffset&=&10;
employeeRequest.fetchLimit&=&10;
NSArray&*employees&=&[Employee&MR_executeFetchRequest:employeeRequest];参数设置.1. 可以通过修改MR_LOGGING_DISABLED预编译指令的值,控制log打印。#define MR_LOGGING_DISABLED 1.2.MagicalRecord在DEBUG模式下,对模型文件发生了更改,并且没有创建新的模型文件版本。MagicalRecord默认会将旧的持久化存储删除,创建新的持久化存储。MagicalRecord中文文档MagicalRecord的使用方法还有很多,这里只是将一些比较常用的拿出来讲讲,其他就不一一讲解了。在Github上有国人翻译的MagicalRecord官方文档,翻译的非常全面,而且是实时更新的。这篇文章关于MagicalRecord的部分,也是参考文章来写的,我这里就犯了个懒……CoreData优缺点总结无论是什么东西,肯定不会是绝对完美的,CoreData也是如此。CoreData被设计出来后,对比其他本地持久化方案有自己独有的优势,也有比较严重的问题。对于一个本地持久化方案的选取,还是要根据公司业务需求,来选择一个适合项目的方案,并没有哪个方案是万能的。优点可以设置关联关系,也就是之前讲过的关联属性,关联属性可以和当前对象一起被MOC操作。例如Company关联一个Person对象,对Company进行操作时,也可以通过点语法从Company中获取Person,Person的修改会随着Company一起被持久化。如果用SQLite实现起来是很麻烦的,但CoreData可以很容易的完成,这也是CoreData更加面向对象的一种体现。更加面向对象,将之前Model层的表示和持久化合二为一。把数据库的交互和对象的转换封装起来,使用时不需要接触到任何SQLite相关的代码,直接使用托管对象即可。开发效率比较快,可以很快的封装一个基于CoreData实现的Model层,而不需要太多的代码就可以实现。可以很好的防范SQL注入的问题。对于SQLite来说,如果是用FMDB并且用?占位符,也可以防范SQL注入的问题。可视化化效果好且结构清晰。将模型文件内部的结构,以及实体之间的对应关系等,以可视化的结构展现出来。对OC原生编程支持非常好,支持keyPath操作方式。例如设置NSPredicate查找条件时,可以使用keyPath的点语法设置属性。而其他持久化存储对于这点支持的不太好,需要编写很复杂的查找条件,看起来也不太好理解。毕竟是Apple自家推出的,所以对OC融合度比较高,可以很好的配合和使用OC对象。设置一对一或一对多的关系,设置关系后做存储和查询也非常方便,这是非常便于开发的。如果对于性能没有苛刻的要求,并且持久化对象之间关系比较复杂,比较推荐使用CoreData。缺点灵活性不如SQLite,CoreData是对SQLite的一个封装,上层不能直接对数据库进行操作。处理任何数据都要按照CoreData内部的实现逻辑执行,而不能自定义执行逻辑,对执行逻辑没有可控性。进行大量数据处理时比较吃力,性能明显低于直接操作SQLite数据库,而且内存占用非常大,需要手动做内存控制。当执行一个操作时涉及的数据比较多,需要将所有相关的托管对象加载到内存中,而且中间还涉及到对象的转换等操作。这样对性能和内存的消耗都是非常大的,和涉及到的数据量成正比。因为CoreData底层是用SQLite实现的,可以在CoreData的基础上,直接编写SQL语句对数据库进行操作。但是并不推荐这样做,在一个项目中应该只有一种持久化的主体方案。而且如果这两种方式混用的话,对于后期维护是非常困难的。如果出现这样的需求,最好直接去用SQLite。CoreData入门门槛比较高,很难很好的掌握。很多人都说CoreData不好用,这个原因很大一部分都是因为使用方式的问题。CoreData框架学习难度比较大,导致很多人都只是简单的使用CoreData,这些用法很多都是不合理的,很多的高级用法并没有用到。写在最后到目前为止CoreData系列的六篇文章就都写完了,文章中可能存在一些没有注意的问题,还请各位提出。博客中包括CoreData在内的所有文章永久更新维护,会不断将新知识添加到对应的文章中,也会对落后的文章进行重写。在第一篇文章中也说到,我接触CoreData时间也不是很长,这系列文章更像是我学习的一个总结。但是我确实是很认真的在写,文章内容也是检查了很多遍,防止错字或者语法问题。知识点总结的还是比较全面的,在后续我还会更深入的学习CoreData,也可能会推出后续文章。许多人对于CoreData有很多意见,认为CoreData有各种各样的问题,这并不是空穴来风。在我学习CoreData的过程中,也发现CoreData确实存在诸多问题,例如查询性能略差、灵活性等。所以在使用CoreData的时候,还是根据公司业务需求来权衡是否使用CoreData。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量14991点击量14611点击量14002点击量10076点击量5564点击量5079点击量5060点击量5054点击量4995
&2016 Chukong Technologies,Inc.
京公网安备89}

我要回帖

更多关于 ios magicalrecord 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信