IOS制作之Core Data系列译文:Core Data概述仓酷云
如果你现在开始学到编出像样的APPiOS5可能已经普及了可以直接用ARC(另之前对ARC的了解很粗浅现在开发程序完全可以直接ARCiOS4不支持的weak是有办法替代的用unsafe_unretainedCoreData多是OSX和iOS中最简单被曲解的框架之一了。为了匡助人人了解,我们将疾速研讨CoreData,来看一下它是关于甚么的。为了准确利用CoreData,有需要了解其观点。几近一切CoreData引发的挫败,都是由于不睬解它能做甚么和它是怎样事情的。让我们入手下手吧。CoreData是甚么?
也许8年前,在2005年4月,Apple公布了OSX10.4版本,第一次引进了CoreData框架。当时YouTube也刚公布。
CoreData是模子层的手艺。CoreData匡助你构建代表程序形态的模子层。CoreData也是一种耐久化手艺,它能够将模子的形态耐久化到磁盘。但它更主要的特性是:CoreData不但是一个加载和保留数据的框架,它也能处置内存中的数据。
假如你曾打仗过Object-relationalmapping(O/RM),CoreData不但是一种O/RM。假如你曾打仗过SQLwrappers,CoreData也不是一种SQLwrapper。它的确默许利用SQL,可是,它是一种更高条理的笼统观点。假如你必要一个O/RM大概SQLwrapper,那末CoreData其实不合适你。
>CoreData供应的最壮大的功效之一是它的对象图形办理。为了更无效的利用CoreData,你必要了解这一部份内容。
另有一点必要注重:CoreData完整自力于任何UI层的框架。从计划的角度来讲,它是完整的模子层的框架。在OSX中,乃至在一些背景驻留程序中,CoreData也起侧重要的意义。
仓库TheStack
CoreData中有很多组件,它是一种十分天真的手艺。在年夜多半利用情形里,设置绝对来讲对照复杂。
当一切组件绑定在一同,我们把它们称为CoreDataStack.这类仓库有两个次要部分。一部分是关于对象图办理,这是你必要把握好的部分,也应当晓得怎样利用。第二部分是关于耐久化的,好比保留模子对象的形态和再次恢复对象的形态。
在这两部分的两头,即仓库两头,是耐久化存储和谐器(PersistentStoreCoordinator,PSC),也被伴侣们戏称做中央监督局。经由过程它将对象图办理部分和耐久化部分绑在一同。当这两部分中的一部分必要和另外一部分交互,将经由过程PSC来调治。
<br>
对象图办理是你的使用中模子层逻辑存在的中央。模子层对象存在于一个context里。在年夜多半设置中,只要一个context,一切的对象都放在这个context中。CoreData撑持多个context,可是是针对更初级的利用情形。必要注重的是,每一个context和其他context辨别都很分明,我们将要来看一点这部份内容。有个主要的事必要记着,对象和他们的context绑定在一同。每个被办理的对象都晓得它属于哪一个context,每个context也晓得它办理着哪些对象。
仓库的另外一部分是耐久化产生的中央,好比CoreData从文件体系读或写。在一切情形下,耐久化存储和谐器(PSC)有一个属于本人的的耐久化存储器(persistentstore),这个store在文件体系和SQLite数据库交互。为了撑持更初级的设置,CoreData撑持利用多个存储器从属于统一个耐久化存储和谐器,而且除SQL,另有一些其余存储范例能够选择。
一个罕见的办理计划,看起来是这个模样的:
<br>
组件怎样一同事情
我们来疾速看一个例子,来讲明这些组件是怎样协同事情的。在我们afullapplicationusingCoreData的文章里,我们恰好有一个实体enity,即一种对象:我们有一个Item实体对应一个title。每个item能够有子items,因而我们有一个父子干系。
这是我们的数据模子。像我们在DataModelsandModelObjects文章里提到的,在CoreData中有一个出格范例的对象叫做Entity。在这类情形下,我们只要一个entity:一个Itementity.一样的,我们有一个NSManagedObject子类叫Item。这个Itementity映照到Item类。在datamodels的文章里会具体的谈到这个。
我们的使用唯一一个根item。这内里没有甚么奇奥的中央。这只是个复杂的我们用在底层的item。这是一个我们永久不会为其设置父类的item.
当app启动,我们没有任何item。我们必要做的第一件事是创立一个根item。你经由过程拔出对象到context里来增加可办理的对象。
创立对象
大概看起来有点粗笨。我们经由过程NSEntityDescription的办法来拔出:
1
2
+(id)insertNewObjectForEntityForName:(NSString*)entityName
inManagedObjectContext:(NSManagedObjectContext*)context
我们倡议你增加两个便利的办法到模子类中:
1
2
3
4
5
6
7
8
9
10
+(NSString*)entityName
{
return@“Item”;
}
+(instancetype)insertNewObjectInManagedObjectContext:(NSManagedObjectContext*)moc;
{
return
inManagedObjectContext:moc];
}
如今,我们能够拔出我们的根对象:
1
Item*rootItem=;
如今在我们的managedobjectcontext里有了一个独一的item.context晓得这个新拔出的被办理对象,这个被办理对象rootItem也晓得这个context(它有-managedObjectContext办法)。
保留改动
到今朝为止,固然我们还没有碰着耐久化存储和谐器大概耐久化存储器。这个新的模子对象,rootItem,只是在内存中。假如我们想保留我们模子对象的形态(我们的情形里就是rootItem),我们必要如许保留context:
1
2
3
4
NSError*error=nil;
if(!){
//Uh,oh.Anerrorhappened.<imgsrc="http://blog.jobbole.com/wp-includes/images/smilies/icon_sad.gif"alt=":("class="wp-smiley">
}
如今,有良多事将要产生。起首,managedobjectcontext算出改动的内容。Context有义务往纪录你对context里任何被办理的对象做出的改动。在我们的例子里,我们迄今为止独一的改动是往里拔出了一个对象,我们的rootItem.
这个managedobjectcontext把这些变更传送给耐久化存储和谐器,让它把改动传送给store。耐久化存储和谐器和谐store(在我们的例子里,是一个SQL存储器)把我们新拔出的对象写进磁盘中的SQL数据库里。NSPersistentStore类办理着和SQLite的真正交互,而且天生必要被实行的SQL代码。耐久化存储和谐器的脚色只是复杂的和谐store和context之间的交互。在我们的例子里,这个脚色绝对复杂,可是更庞大的使用里能够有多个store和多个context.
更新干系
CoreData的主要才能是它能够办理干系。我们看一个复杂的例子,加第二个item,把它设为rootItem的子item。
1
2
3
Item*item=;
item.parent=rootItem;
item.title=@"foo";
好了。再次注重,这些改动只是在managedobjectcontext内里。一旦我们保留了context,managedobjectcontext就会告知耐久化存储和谐器往把谁人新建的对象增加到数据库文件中,像我们的第一个对象一样。可是它也一样会更新从我们第二个item到第一个的干系,或从第一个对象到第二个的干系。记着一个Item实体是怎样有了父子干系。同时他们也有相反的干系。由于我们把第一个item设为第二个的父类,第二个就会是第一个的子类。Managedobjectcontext纪录了这些干系,耐久化存储和谐器和store耐久化(好比保留)这些干系到磁盘。
弄清对象
假定我们已利用了我们的app一段工夫,而且已增加了一些子items到根item,乃至一些子items到子items。我们再次启动app,CoreData已在数据库文件中存储了这些item之间的干系,对象图已存在了。如今我们必要掏出我们的根item,如许我们能够显现底层items列表。我们有两种举措来完成这个,我们先来看一个复杂的。
当根Item对象创立并保留后,我们能够猎取它的NSManagedObjectID。这是一个不通明的对象,只代表根Item对象。我们能够把它保留到NSUserDefaults,像如许:
1
2
NSUserDefaults*defaults=;
;
如今,当我们的app运转中,我们能够像如许取回这个对象:
1
2
3
4
5
NSUserDefaults*defaults=;
NSURL*uri=;
NSManagedObjectID*moid=;
NSError*error=nil;
Item*rootItem=(id);
固然,在一个真实的app中,我们必要反省NSUserDefaults是不是前往了一个无效的值。
方才产生的事变是,managedobjectcontext让耐久化存储和谐器往从数据库里猎取指定的对象。谁人root对象如今就被恢复到了context中。可是一切其他的item还不在内存中。
rootItem有一个干系哨子干系,可是那儿还甚么也没有。我们想显现rootItem的一切子item,以是我们挪用:
1
NSOrderedSet*children=rootItem.children;
如今产生的是,context注重到要猎取rootItem有联系关系的children,会失掉一个所谓的妨碍。CoreData已标志了这个干系作为一件必要被办理的事。既然我们已在这个时分会见了它,context如今会主动和耐久化存储和谐器往和谐,来载进这些子item到context里。
这个听起来多是不主要的,可是现实上这个中央有良多事变产生。假如子对象中可巧有一些已在内存中了,CoreData必要包管它会重用这些对象。这就叫做独一性。在context中,历来不会有多于一个对象对应于一个给定的item.
其次,耐久化存储和谐器有它本人外部对象值的缓存。假如context必要一个指定的对象(好比一个子item),而且耐久化存储和谐器已在内存中有它必要的值了,这个对象能够被间接加到context,不必要经由过程store。这个很主要,由于利用store意味着实行SQL语句,这要比间接用内存中的值慢良多。
我们持续从一个item到子item再到子item,我们渐渐的把全部对象图加载到managedobjectcontext。可是一旦它们都在内存中,操纵对象,大概猎取它们的干系都是很快的,由于我们只是在managedobjectcontext中事情。我们完整不必要和耐久化存储和谐器打交道。这时候候猎取我们的Item对象的title,parent,children属性都很快也很便利。
了解在这些情形中数据是怎样猎取的很主要,由于它影响功能。在我们的这个例子里,它不太主要,由于我们没有利用良多数据。可是一旦你入手下手利用,你就必要了解面前产生了甚么。
当你猎取一种干系(好比我们的例子是父子干系),上面三种情形中的一个会产生:(1)这个对象已在context中,猎取基础上没有开支。(2)这个对象不在context中,可是由于你比来从store中猎取过这个对象,耐久化存储和谐器缓存了它的值。这类情形得当廉价一些(固然一些操纵会被锁住)。开支最年夜的情形是:(3)当这个对象被context和耐久化存储和谐器都第一次会见,如许它必要被store从SQLite数据库中掏出来。这类情形要比1和2开支年夜良多。
假如你晓得你必要从store中猎取对象(由于你还没有它们),当你限定一次取回几个对象时,将会发生很年夜分歧。在我们的例子里,我们大概必要一次猎取一切的子item,而不是一个接一个。这能够经由过程一个特别的NSFetchRequest来完成。可是我们必定要当心只是在我们必要的时分才实行一次掏出哀求。由于一个掏出哀求将会引发(3)产生,它老是必要经由过程SQLite数据库来猎取。因而,假如功能很主要,反省对象是不是已存在就很需要。你可使用-来检测一个对象是不是已存在。
改动对象的值
如今,好比我们要改动一个item对象的title:
1
item.title=@"Newtitle";
当我们这么做的时分,这个item的title就改动了。可是同时,managedobjectcontext会把这个item标志为已改动,如许当我们挪用context的-save:,它将会经由过程耐久化存储和谐器和响应的store保留起来。context的一个主要职责就是标志改动。
context晓得从前次保留后,哪些对象已被拔出,改动和删除。你能够经由过程-insertedObjects,-updateObjects,-deletedObject这些办法来猎取。一样的,你也能够经由过程-changedValues办法问一个被办理的对象,它的哪些值变了。你大概历来都不必要这么做。可是这是CoreData能够把改动保留到撑持的数据库中的体例。
当我们拔出一个新的Item对象,CoreData晓得必要把这些改动存进store。如今,当我们改动title,也会产生一样的事变。
保留值必要和耐久化存储和谐器另有耐久化store顺次会见SQLite数据库。当恢复对象和值时,利用store和数据库比间接在内存中操纵数据绝对泯灭资本。保留有一个流动的开支,不论你要保留的变更有几。而且每次变更都有本钱,这只是SQLite的事情。当你改动良多值时,必要将变动打包,并批量变动。假如你每次改动都保留,必要支付高贵的价值,由于你必要常常保留。假如你保留次数少一些,你将会有有一多量变动交由SQLite来处置。
必要注重的是保留是原子性的。它们都是事件。大概一切的改动都被提交到store/SQLite数据库,大概任何改动都不会被保留。当你完成自界说的NSIncrementalStore子类的时分,这点很主要应当要记着。你能够包管保留永久不会失利(好比由于抵触),大概你的store子类必要在保留失利时恢复一切改动。不然,内存中的对象图会和store中的纷歧致。
关于UIView的子类有很多UIButtonUITableView这个都需要各个击破看看文档从名字上就很容易理解是做什么的UIViewController是管理View和Model的类(@张开说UIViewController是用来管理view的,管理model的类自己写,当然,model也可以用UIViewController来管理,不过恐怕成为不好的代码。 AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。 培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦, 特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地 在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解 看《iPhone 4与iPad开发基础教程》,跟着一步步来 然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践, 好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。 还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。 众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。 最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。 从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以, 才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。 特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地 看《iPhone 4与iPad开发基础教程》,跟着一步步来 看《iPhone 4与iPad开发基础教程》,跟着一步步来 这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。 我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。 在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。 iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
页:
[1]