美文网首页iOS旅途
CoreData简单入门——单个表的增删改查

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

作者: 朝阳小麦 | 来源:发表于2019-01-23 11:45 被阅读2次

    适用人群: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");
        }
    }
    

    欢迎留言。

    相关文章

      网友评论

        本文标题:CoreData简单入门——单个表的增删改查

        本文链接:https://www.haomeiwen.com/subject/pogflqtx.html