CoreData的使用

上班几年了没用过这玩意,今天简单的测试了一下,记录一下。

首先创建项目的勾选上use core data
手动添加不知道怎么弄,后续再看一下
项目创建以后,会生成一个.xcdatamodeld结尾的文件
在这里插入图片描述
后面添加Model类,单击xcdatamodeld文件,左下角会有一个Add Entity的按钮,可以新增一个model类并且可以添加这个model的属性
点击1添加model
设置上述之后就是自动创建文件了,打开xcode,桌面最上面单击Editor - Create NSManagedObject subclass,如图
在这里插入图片描述
接下来勾选上你的项目然后next,勾选新加的model然后next,会生成两个类
在这里插入图片描述
在添加完上面两个类以后,运行的时候报错了,而且这个错误不能点开查看,也不能生成日志文件,只知道解决办法。首先选中上方File,点击Project setting,将上面那个Build System修改成Legacy Build System
在这里插入图片描述
重新编译一下,只有一个错误了。第二个错误是由于重复导入的问题,选中工程,然后点击Build Phases,打开Compile Sources,会有一个Model名+CoreDataClass.m的文件,将这个删除掉重新编译
在这里插入图片描述
OK,到这里两个错误已经解决了。接下来就是使用了。
创建一个NSObject类,导入头文件#import <CoreData/CoreData.h>,直接上代码把。

这是自定义的LJCoreDataStackManager.h文件

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

#define kLJCoreDataStackManager [LJCoreDataStackManager shareInstance]

NS_ASSUME_NONNULL_BEGIN

@interface LJCoreDataStackManager : NSObject


+ (LJCoreDataStackManager *)shareInstance;

@property (nonatomic, strong) NSManagedObjectContext *context;

@property (nonatomic, strong) NSManagedObjectModel *model;

@property (nonatomic, strong) NSPersistentStoreCoordinator *dinator;

- (void)save;
@end

接下来是LJCoreDataStackManager.m文件

#import "LJCoreDataStackManager.h"

@implementation LJCoreDataStackManager

+ (LJCoreDataStackManager *)shareInstance
{
    static LJCoreDataStackManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[LJCoreDataStackManager alloc] init];
    });
    return manager;
}

- (NSManagedObjectContext *)context {
    if (!_context) {
        _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        _context.persistentStoreCoordinator = self.dinator;
    }
    return _context;
}

- (NSManagedObjectModel *)model {
    if (!_model) {
        _model = [NSManagedObjectModel mergedModelFromBundles:nil];
    }
    return _model;
}

- (NSPersistentStoreCoordinator *)dinator  {
    if (!_dinator) {
        _dinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];
        NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *sqlPath = [docStr stringByAppendingPathComponent:@"person.sqlite"];
        NSURL *url = [NSURL fileURLWithPath:sqlPath];
        NSError *error;
        [_dinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
        if (error) {
            NSLog(@"添加数据库失败:%@", error);
        } else {
            NSLog(@"添加数据库成功");
        }
        
    }
    return _dinator;
}

- (void)save {
    NSError *error = nil;
    [self.context save:&error];
    NSLog(@"保存数据 error = %@", error);
}
@end

下面是增加的代码

Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:kLJCoreDataStackManager.context];
    person.age = [self.ageTextField.text intValue];
    person.name = self.nameTextField.text;
    [kLJCoreDataStackManager save];

查询所有

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    self.datalist = [NSMutableArray arrayWithArray:[kLJCoreDataStackManager.context executeFetchRequest:request error:nil]];

按条件查询(使用NSPredicate)

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age >= 13"];
    request.predicate = predicate;
    NSArray<Person *> *arr = [kLJCoreDataStackManager.context executeFetchRequest:request error:nil];

删除

Person *person = [self.datalist objectAtIndex:indexPath.row];
    [kLJCoreDataStackManager.context deleteObject:person];

记得删除之后调用一下context的save方法,同步到数据库,不然杀了进程重新进来以后数据又回来了。
在这里插入图片描述

先记录到这,后续再加。
一两年没有做ios的项目了,欢迎各位大佬为小弟来指点迷津。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值