iOS CoreData的使用

CoreData是一个专门管理数据服务的框架,把OC对象和存储在SQLite文件中的数据进行互相转换,极大地方便了开发者在数据服务方面的开发。

1. 创建CoreData

在文件创建区下,选择【Core Data】下的【Data Model】
在这里插入图片描述

输入CoreData的文件名Model.xcdatamodel
在这里插入图片描述

Model.xcdatamodeld文件默认是Swift的,如果想要改成oc,可以在打开Model.xcdatamodeld文件,在右侧工具栏中修改。
在这里插入图片描述

2. 创建Entity

CoreData文件下面有个【Add Entity】的按钮,点击它就创建了一个空表。
可以在Entity里面添加AttributesRelationshipsFetched Properties,分别是属性、关联关系以及获取操作。
在这里插入图片描述

属性类型

类型说明
Integer 16整数,范围是-32768 ~ 32767
Integer 32整数,范围是-2147483648 ~ 2147483647
Integer 64整数,范围是–9223372036854775808 ~ 9223372036854775807
Decimal数值,用NSDecimalNumber表示
Double双精度浮点数
Float浮点数
String字符串,用NSString表示
Boolean代表布尔值
Date日期时期
Binary Data二进制,用NSData表示
URIURL对象,用NSURL表示
TransformableObjective对象,要遵守NSCoding协议

关联关系的Inverse属性表示是否可以从一个实体中找到另一个实体,这样使两个实体具有双向的关联关系。

【Editor Style】按钮可以看出实体和属性的关系,以及可以看出实体之间的对应的关系。
在这里插入图片描述

3. 生成模型文件

选择【Editor】菜单下的【Create NSManagedObject Subclass…】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终生成StudentModelTeacherModel文件
在这里插入图片描述

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];

插入操作,通过NSEntityDescriptioninsert进行插入操作,添加到数据库中

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];
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值