关于Coredata,我已经看了几天了。看不不少别人写的文章,可以说,到今天为止,我仍未弄明白。
还是跟随苹果的例子来吧,看看能有什么发现。首先需要建立一种概念,Coredata是数据存储,它并不是真的数据库,因此它存储的主要内容是对象本身-想象一下nib文件就是Coredata数据,当然它也可以用来保存纯数据。
1. Coredata 模型
如果你学过数据库,或者哪怕是foxpro,你对数据库就有了一个粗略的印象。数据库是由一个或多个表组成的,所谓的CoreData模型,你可以理解成数据库,你也可以建立多个表--这里称为 entity,他们有字段,这里叫做属性,每个属性有类型信息--它似乎没有字段长度的感念,管它呢。比如SQL Sever, CoreData的不同之处,在于它将那些表的定义单独提出来了,构成一个扩展名为xcdatamodeld 的文件。你可以在IB里面编辑它,也可以编程来处理。
要得到保存在文件中的CoreData数据,第一步要做的就是调入模型,调入也好,编程动态建立也好。负责模型的这个类是:NSManagedObjectModel,需要有一个这样的对象,对模型进行管理。
接下来,建立一个存放数据的类,。这个类的类名是NSManagedObjectContext,也就是说,如果从一个已经存在的CoreData数据文件,得到数据,数据将从文件调入,并保存在NSManagedObjectContext的类对象里面。看看下面的例子。
int main (int argc, const char * argv[]) { |
NSManagedObjectModel *mom = managedObjectModel(); |
NSLog(@"mom: %@", mom); |
if (applicationLogDirectory() == nil) { |
NSLog(@"Could not find application logs directory\nExiting..."); |
exit(1); |
} |
NSManagedObjectContext *moc = managedObjectContext(); |
NSEntityDescription *runEntity = [[mom entitiesByName] objectForKey:@"Peoples"]; |
Person *person = [[Person alloc] initWithEntity:runEntity insertIntoManagedObjectContext:moc]; |
person.personID = @“123”; person。name= @“wang”; |
|
NSError *error; |
if (![moc save: &error]) { |
NSLog(@"Error while saving\n%@", |
([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); |
exit(1); |
} |
return 0; |
} |
这段代码相当受启发。为了理解方便,上面的代码我改动了一点内容。它的主要作用是,首先,建立一个NSManagedObjectModel对象。然后建立管理内容数据的类: NSManagedObjectContext,并且为这个对象建立模型(也就是表定义),这样它才知道能够处理什么样的数据,我们这里是Person。
接下来,程序建立了一个Person 对象, 并设定了必要的属性。 insertIntoManagedObjectContext:moc 将这个新建的Pseson插入到内容对象里面,内容对象因此有了内容。最后,将内容文件的内容保存,形成有数据的CoreData文件。
至于上面的程序是否正确,文件存到哪里去了。我们以后再探讨。这一节,我们毕竟弄明白了一个基本的机制, NSManagedObjectModel和 NSManagedObjectContext 对象的作用。
这一节内容有点少,但是并不单薄, 我希望你自己去找资料看看。CoreData毕竟太重要了,无论你做了什么总要保存吧。下一个节我会尝试做一个例子,来演示CoreData的处理过程。