coreData详解

来源:互联网 发布:淘宝名忘了怎么找回 编辑:程序博客网 时间:2024/06/07 04:09

大家好,此次是讲解的coreData这一块,其实平时一直用Sqlite3,所以很少接触啦,当然此次将依托最新的xcode6来讲解的。

现在,我们新建一个工程的时候,就可以勾选use coreData,请睁大眼睛好好找找选项在哪里。

如果我们勾选了coredata,我们的文件中出现了一个xcdatamodeld的文件。

点击这个文件吧,看到下面的图片


当然,我已经建立了Entities,那这个Entity是什么呢,我们接下来详细的讲解下各个属性。

我一开始也对于coreData心生畏惧,因为其中的概念实在太多了,我其实也很不明白Apple的做法。

首先4个概念,请搞清楚:

NSManagedObjectModel :这个是用来获取就是上面那个xcdatamodeld文件的

NSPersistentStoreCoordinator:这个是什么,我叫他仓库管理,这个我们无须打交道,只要初始化就行了。

NSPersistentStore:这个是仓库,什么是仓库,就是我们在本地存的数据库,懂了吧

NSManagedObjectContext:这个是最最关键的,我们的增删改查,全和他打交道。


本来是有张图的,可是我找不到了,真是很抱歉,我说说他们之间的关系吧

首先我们肯定要获取NSManagedObjectModel,这个就是我们上面的图,他可以获取我们设置的具体信息。

NSManagedObjectModel * model = [NSManagedObjectModel mergedModelFromBundles:nil];

设置nil说明了我们去取mainBundle因为可能由于引入了很多第三方的库,本身也存在一些bundle文件,直接设置nil,可以让我们直接去去mainbundle。


NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];        NSString * docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];    NSString * filePath = [docs stringByAppendingPathComponent:@"splite.data"];        NSError * error = nil;    NSPersistentStore * store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:filePath] options:nil error:&error];        if (store == nil) {        NSLog(@"创建仓库关联失败!");    }

当我们创建仓库管理,我们首先要把仓库和我们xcdatamodel文件建立起来,这时候NSPersistentStoreCoordinator,首先要依托一个model初始化,就是我们从mainbundle读取到的model文件。那么仓库是什么,就是我们在沙盒中,建立的数据库。

然后,我们把仓库管理设置到context就可以,这样,以后我们直接使用context进行操作。有没有注意一点,就是我们添加仓库的时候,仓库的类型代表了存储的格式数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型,我们这里一般选用的是SQL,就是我们最熟悉的数据库操作。


接下来就是增删改查了,我们以代码略过。

- (void)add{    Device * device = [NSEntityDescription insertNewObjectForEntityForName:@"Device" inManagedObjectContext:mContext];        device.ip = @"1111";    device.push = @1;    device.name = @"woshiname";    NSError * error = nil;    [mContext save:&error];}- (void)query{    //NSFetchRequest * fetch = [NSFetchRequest fetchRequestWithEntityName:@"Device"];    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Device" inManagedObjectContext:mContext];    [fetchRequest setEntity:entity];    // Specify criteria for filtering which objects to fetch    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@", @"woshiname"];    [fetchRequest setPredicate:predicate];    // Specify how the fetched objects should be sorted    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"ip"                                                                   ascending:YES];    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];        NSError *error = nil;    NSArray *fetchedObjects = [mContext executeFetchRequest:fetchRequest error:&error];    if (fetchedObjects == nil) {        NSLog(@"获取失败");    }    NSLog(@"%@",fetchedObjects);}- (void)delete{    [mContext deleteObject:nil];        NSError * error = nil;    [mContext save:&error];}

有个小技巧,查询的时候fetch的时候,直接输入fecth,因为xcode6已经做了代码块的预定义,可能苹果也想到这段代码太过于复杂。

当然这些都是代码里面应该做的事情,那么我们在xcdatamodel文件里改怎么设置呢?


我们来看一个关键字:

ENTITIES:这个就是我们常说的表名,也许这样更容易理解

ATTRIBUTES:这个就是表中的字段,我们可以设置字段名,和类型

RELEATIONSHIP:这个要特别讲一下,就是表关联,表关联是最关键的一个知识点,因为我们设置的表不可能单独存在,表之间的数据是相互关联的,建议看一下这篇文章,详细的介绍了一对一,一对多的关系,如何去进行多表之间的查询操作。

下一节,我讲把coredata一些零碎的知识讲解一下。

0 0
原创粉丝点击