适用人群:iOS开发人员。假设你对数据库有最基本的了解,比如数据库,表,增删改查。
本文内容:CoreData数据库存储。(CoreData支持多种存储方式,这里选择sqlite数据库存储。)
注意:有些人喜欢把CoreData的Entity类直接拿去当Model使用,强烈建议不要这么写。注意代码整齐。
目录:
1.创建CoreData模型,实体模型;
2.创建操作上下文;
3.添加数据;
4.查询数据;
5.修改数据;
6.删除数据。
1.创建CoreData模型,实体模型
创建项目的时候,不用勾选“CoreData”选项。因为xcode自动生成的一些CoreData代码,不兼容低版本(8.0)。这块自己写就好了。创建好项目后,新增文件,文件选择CoreData--DataModel,如下图所示:
创建DataModel
然后就可以在工程目录中看到自己创建的这个文件,Model.xcdatamodeld:
注意文件后缀名为.xcdatamodeld
选中这个文件,添加实体。每个实体就对应生成一个数据表。这里,我创建了一个UserEntity实体类,并为之增加了一些属性,如下图所示,注意每一个红框标注的部分:
这里需要注意一点,创建实体的时候,默认实体模型是Class Definition自动创建,这里我们改成手动,Manual/None。接下来,就来手动创建了。选中Model.xcdatamodeld文件,在xcode菜单栏点击Editor--Create NSManagedObject Subclass...,如下图:
选择存放文件夹,点击Create创建,即可。之后如果表结构有变动,再重新执行此操作。并且这里要注意,有个版本的感念,APP版本迭代的时候,CoreData模型也要跟着版本迭代。具体这里不概述。
到这里,表就完成创建了。
2.创建操作上下文
这里,我创建了一个文件UserEntityManager。详细代码如下:
代码里都介绍的比较详细了,就不一一描述了。
UserEntityManager.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "UserEntity+CoreDataClass.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserEntityManager : NSObject
@property (nonatomic, strong) NSManagedObjectContext *context;
- (void)addDatas;
- (void)addOneData;
@end
NS_ASSUME_NONNULL_END
UserEntityManager.m
#import "UserEntityManager.h"
@implementation UserEntityManager
- (instancetype)init
{
self = [super init];
if (self) {
//加载实体
NSURL *url = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
//创建协调器
//persistentStoreCoordinator 会根据对应的模型结构创建持久化的本地存储
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,
NSInferMappingModelAutomaticallyOption:@YES};
NSURL *storeUrl = [[self documentDirectoryURL] URLByAppendingPathComponent:@"MyCoreData.sqlite"];
NSLog(@"store url:%@", storeUrl);
NSError *error;
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
if (error) {
NSLog(@"数据库创建失败~~~~~: %@", error.localizedDescription);
} else {
NSLog(@"数据库创建成功~~~~~");
}
//创建managedObjectContext
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context.persistentStoreCoordinator = coordinator;
self.context = context;
}
return self;
}
// 用来获取 document 目录
- (nullable NSURL *)documentDirectoryURL {
return [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject;
}
@end
3.添加数据
上面的代码直接就看到数据的增加了。需要注意的是,数据库的操作是比较费时费性能的,如果有多个操作的话,建议操作完成后,再统一执行[self.context save:nil];去把改动保存到数据库。
添加一条数据:
- (void)addOneData {
UserEntity *d1 = [NSEntityDescription insertNewObjectForEntityForName:@"UserEntity" inManagedObjectContext:self.context];
d1.name = @"小明+test";
d1.sex = 1;
d1.remark = @"个性签名";
d1.date = [NSDate date];
[self.context save:nil];
}
添加多条数据:
- (void)addDatas {
for (int i=0; i<500; i++) {
UserEntity *d1 = [NSEntityDescription insertNewObjectForEntityForName:@"UserEntity" inManagedObjectContext:self.context];
d1.name = [NSString stringWithFormat:@"小明+%d", i];
d1.sex = 1;
d1.remark = @"个性签名";
d1.date = [NSDate date];
[NSThread sleepForTimeInterval:0.01];
}
[self.context save:nil];
}
4.查询数据
- (NSArray<UserEntity *> *)fetchDatas {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserEntity"
inManagedObjectContext:self.context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
// request.fetchLimit = 1;
[request setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"remark = %@", @"个性签名"];
[request setPredicate:pred];
NSError *error = nil;
NSArray<UserEntity *> *objects = [self.context executeFetchRequest:request error:&error];
if (error) {
return @[];
}
return objects;
}
5.修改数据
先查到要修改的实体,把实体数据改动下,再save到数据库。
- (UserEntity *)fetchOneData:(NSString *)userId {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserEntity"
inManagedObjectContext:self.context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.fetchLimit = 1;
[request setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"userId = %@", userId];
[request setPredicate:pred];
NSError *error = nil;
NSArray<UserEntity *> *objects = [self.context executeFetchRequest:request error:&error];
if (error) {
return nil;
}
return [objects firstObject];
}
- (void)updateUserName:(NSString *)userName remark:(NSString *)newRemark {
UserEntity *entity = [self fetchOneData:@"121"];
if (entity) {
entity.remark = newRemark;
NSError *error = nil;
[self.context save:&error];
if (error) {
NSLog(@"保存失败");
} else {
NSLog(@"保存Succ");
}
}
}
6.删除数据
查到该条数据,删除,save操作到数据库,即可。
- (UserEntity *)fetchOneData:(NSString *)userId {
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserEntity"
inManagedObjectContext:self.context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.fetchLimit = 1;
[request setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"userId = %@", userId];
[request setPredicate:pred];
NSError *error = nil;
NSArray<UserEntity *> *objects = [self.context executeFetchRequest:request error:&error];
if (error) {
return nil;
}
return [objects firstObject];
}
- (void)deleteUserById:(NSString *)userId {
UserEntity *entity = [self fetchOneData:userId];
if (entity) {
[self.context deleteObject:entity];
}
NSError *error = nil;
[self.context save:&error];
if (error) {
NSLog(@"保存失败");
} else {
NSLog(@"保存Succ");
}
}
欢迎留言。
网友评论