CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。
1. 创建CoreData
在文件创建区下,选择【Core Data】下的【Data Model】
输入CoreData的文件名Model.xcdatamodel
Model.xcdatamodeld文件默认是Swift的,如果想要改成oc,可以在打开Model.xcdatamodeld文件,在右侧工具栏中修改。
2. 创建Entity
CoreData文件下面有个【Add Entity】的按钮,点击它就创建了一个空表。
可以在Entity
里面添加Attributes
、Relationships
和Fetched Properties
,分别是属性、关联关系以及获取操作。
属性类型
类型 | 说明 |
---|---|
Integer 16 | 整数,范围是-32768 ~ 32767 |
Integer 32 | 整数,范围是-2147483648 ~ 2147483647 |
Integer 64 | 整数,范围是–9223372036854775808 ~ 9223372036854775807 |
Decimal | 数值,用NSDecimalNumber表示 |
Double | 双精度浮点数 |
Float | 浮点数 |
String | 字符串,用NSString表示 |
Boolean | 代表布尔值 |
Date | 日期时期 |
Binary Data | 二进制,用NSData表示 |
URI | URL对象,用NSURL表示 |
Transformable | Objective对象,要遵守NSCoding协议 |
关联关系的Inverse
属性表示是否可以从一个实体中找到另一个实体,这样使两个实体具有双向的关联关系。
【Editor Style】按钮可以看出实体和属性的关系,以及可以看出实体之间的对应的关系。
3. 生成模型文件
选择【Editor】菜单下的【Create NSManagedObject Subclass…】
最终生成StudentModel
和TeacherModel
文件
StudentModel+CoreDataClass
文件里面StudentModel
继承了NSManagedObject
@class TeacherModel;
@interface StudentModel : NSManagedObject
@end
StudentModel+CoreDataProperties
文件
@interface StudentModel (CoreDataProperties)
+ (NSFetchRequest<StudentModel *> *)fetchRequest;
@property (nonatomic) int32_t age;
@property (nullable, nonatomic, copy) NSString *name;
@property (nullable, nonatomic, retain) TeacherModel *teacher;
@end
@implementation StudentModel (CoreDataProperties)
+ (NSFetchRequest<StudentModel *> *)fetchRequest {
return [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];
}
@dynamic age;
@dynamic name;
@dynamic teacher;
@end
4. CoreData核心类
类名 | 说明 |
---|---|
NSPersistentStoreCoordinator | 数据库的连接器,设置数据存储的名字,位置,存储方式等 |
NSManagedObjectContext | 负责应用与数据库之间的交互,增删改查基本操作都要用到 |
NSManagedObjectModel | 被管理的数据模型,可以添加实体及实体的属性,为xxx.xcdatamodeld文件 |
NSManagedObject | 从CoreData中取出来的对象,默认都是NSManagedObject对象,通过键值对来存取所有的实体属性,相当于数据库中的表格记录 |
NSFetchRequest | 获取数据时的请求 |
一般都在AppDelegate
中创建,以便在各处使用
@property(nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property(nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
- (NSManagedObjectModel *)managedObjectModel {
if (!_managedObjectModel) {
// 创建数据模型文件,类型为momd
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (!_persistentStoreCoordinator) {
// 创建数据库连接器
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
// 关联相关的sqlite文件,如果没有则创建一个新的
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).lastObject;
NSURL *sqliteUrl = [NSURL URLWithString:[docPath stringByAppendingPathComponent:@"blog.sqlite"]];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqliteUrl options:nil error:nil];
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectContext *)managedObjectContext {
if (!_managedObjectContext) {
// 创建上下文对象,ConcurrencyType主要有NSPrivateQueueConcurrencyType和NSMainQueueConcurrencyType
// NSPrivateQueueConcurrencyType表示私有并发队列的类型,操作也是在子线程中完成
// NSMainQueueConcurrencyType表示主并发队列类型,在UI上的操作,使用这个参数初始化
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// 关联数据库连接器
_managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
}
return _managedObjectContext;
}
- (void)saveContext {
NSError *error = nil;
if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
NSLog(@"saveContext error = %@", error.userInfo);
}
}
5. 数据操作
查找操作,NSFetchRequest
查询特定实体,NSPredicate限制查询条件,。
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"StudentModel"];
if (name.length > 0) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", name];
request.predicate = predicate;
}
NSArray *data = [self.managedObjectContext executeFetchRequest:request error:nil];
插入操作,通过NSEntityDescription
的insert
进行插入操作,添加到数据库中
StudentModel *student = [NSEntityDescription insertNewObjectForEntityForName:@"StudentModel"
inManagedObjectContext:self.managedObjectContext];
student.name = self.nameTextField.text;
student.age = [self.ageTextField.text intValue];
[self saveContext];
编辑操作,需要先查询需要删除的托管对象,self.currentModel
是上面查询到的某条数据
self.currentModel.name = self.nameTextField.text;
self.currentModel.age = [self.ageTextField.text intValue];
[self saveContext];
删除操作,同编辑操作,也需先查询托管对象
[self.managedObjectContext deleteObject:self.currentModel];
[self saveContext];