大家好,此次是讲解的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一些零碎的知识讲解一下。