CoreData使用
- 创建步骤流程
- 第一步先创建.xcdatamodeld文件(New File -> iOS -> Core Data ->Data Model)
名字虽然可以任意取,但最好还是取和自己存储数据库名字一样的名字。这样可读性更高些。(ps:这个文件就相当于数据库文件一样,数据库文件中可以有多个表,表中可以有各个字段值,这里也可以有多个实体,每个实体有各个键值)
通过上面的操作就可以创建一个.xcdatamodeld文件,现在我们点击这个文件,在最下面找到Add Entity按钮,进行实体添加。
现在我们添加了一个名字为Entity的实体,这个名字是默认名字,现在我们可以对他进行名字的更改,对它双击一下即可修改名字,或者在xcode右边的信息栏中也可以修改
通过上面操作我们已经创建好了实体的名字,现在我们需要往实体中添加我们需要的键值。(ps:相当于数据库表中的字段),具体操作看图说话(实体之间的关联我就不介绍了,有兴趣的可以自行搜索资料,个人觉得会了单个实体创建外加查询就行,关联也无非是找到关联的实体中共同的键值从而取得另外一个实体对象,我们可以直接先从一个实体取得指定键值对应的属性,再通过属性值去查询另一个实体,只是没关联的那么方便而已)。
- 第二步创建关联类来操控CoreData实体对象(选中.xcdatamodeld文件->xcode菜单栏->Edit->Create NSManagedObject Subclass)
选中自己需要关联的.xcdatamodeld文件名称,点击下一步即可。
选中.xcdatamodeld文件中需要关联的实体对象,点击下一步然后在选择存储目录即可。
完成后会发现自动生成了实体名称对应的类和扩展类(Entity.h/.m和Entity+CoreDataProperties.h/.m)
Relationships类似于SQLite的外键,定义了在同一个模型中,实体与实体之间的关系。可以定义为对一关系或对多关系,也可以定义单向或双向的关系,根据需求来确定。如果是对多的关系,默认是使用NSSet集合来存储模型。
Inverse是两个实体在Relationships中设置关联关系后,通过设置inverse为对应的实体,这样可以从一个实体找到另一个实体,使两个实体具有双向的关联关系。
//
// ViewController.m
// CoreDataDemo
//
// Created by pk on 14/10/24.
// Copyright (c) 2014年 pk. All rights reserved.
//
#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "User.h"
#import "WuGong.h"
@interface ViewController (){
IBOutlet UITextField* _nameField;
IBOutlet UITextField* _scoreField;
//管理者上下文,我们直接调用的类
NSManagedObjectContext* _context;
}
- (IBAction)add:(id)sender;
- (IBAction)fetch:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_context = [[NSManagedObjectContextalloc] init];
//user模型
NSManagedObjectModel* user = [NSManagedObjectModelmergedModelFromBundles:nil];
//协调者
NSPersistentStoreCoordinator* coordinator = [[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:user];
//储存方式
NSString* path = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents/abcd.db"];
[coordinator addPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:path] options:nilerror:nil];
_context.persistentStoreCoordinator = coordinator;
}
- (void)add:(id)sender{
User* user = [NSEntityDescriptioninsertNewObjectForEntityForName:@"User"inManagedObjectContext:_context];
user.name = _nameField.text;
user.score = [NSNumbernumberWithInt:[_scoreField.textintValue]];
user.wugong = [NSEntityDescriptioninsertNewObjectForEntityForName:@"WuGong"inManagedObjectContext:_context];
user.wugong.name =@"葵花宝典";
//保存
if ([_contextsave:nil]) {
NSLog(@"保存成功");
} else {
NSLog(@"保存失败");
}
}
- (void)fetch:(id)sender{
//查询请求
NSFetchRequest* request = [[NSFetchRequestalloc] init];
//关联要查询的实体
NSEntityDescription* entity = [NSEntityDescriptionentityForName:@"User"inManagedObjectContext:_context];
[request setEntity:entity];
//指定对结果的排序方式
NSSortDescriptor* sortDescriptor = [[NSSortDescriptoralloc] initWithKey:@"name"ascending:YES];
NSArray* sortDescriptions = [[NSArrayalloc] initWithObjects:sortDescriptor,nil];
[request setSortDescriptors:sortDescriptions];
//开始查询
NSArray* array = [_contextexecuteFetchRequest:request error:nil];
for (User* userin array) {
NSLog(@"%@-%@-%@", user.name, user.score, user.wugong.name);
// if ([user.name isEqualToString:@"haha"]) {
// user.score = @90;
// [_context save:nil];
[_context deleteObject:user];
// }
}
}
@end