CoreData简单入门——单个表的增删改查

适用人群:iOS开发人员。假设你对数据库有最基本的了解,比如数据库,表,增删改查。
本文内容:CoreData数据库存储。(CoreData支持多种存储方式,这里选择sqlite数据库存储。)

注意:有些人喜欢把CoreData的Entity类直接拿去当Model使用,强烈建议不要这么写。注意代码整齐。

目录:
1.创建CoreData模型,实体模型;
2.创建操作上下文;
3.添加数据;
4.查询数据;
5.修改数据;
6.删除数据。

1.创建CoreData模型,实体模型

创建项目的时候,不用勾选“CoreData”选项。因为xcode自动生成的一些CoreData代码,不兼容低版本(8.0)。这块自己写就好了。创建好项目后,新增文件,文件选择CoreData--DataModel,如下图所示:


12338684-9fc3f060e2d555c1.png
创建DataModel

然后就可以在工程目录中看到自己创建的这个文件,Model.xcdatamodeld:


12338684-36a020f12618dbcb.png
注意文件后缀名为.xcdatamodeld

选中这个文件,添加实体。每个实体就对应生成一个数据表。这里,我创建了一个UserEntity实体类,并为之增加了一些属性,如下图所示,注意每一个红框标注的部分:


12338684-557936643a587f1b.png

这里需要注意一点,创建实体的时候,默认实体模型是Class Definition自动创建,这里我们改成手动,Manual/None。接下来,就来手动创建了。选中Model.xcdatamodeld文件,在xcode菜单栏点击Editor--Create NSManagedObject Subclass...,如下图:


12338684-ed2b3f38ae62d621.png

12338684-cf104545e42f8bfe.png

选择存放文件夹,点击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");
    }
}

欢迎留言。

猜你喜欢

转载自blog.csdn.net/weixin_34279184/article/details/87374287