iOS:CoreData使用

本文详细介绍了如何使用Apple的CoreData框架在iOS应用中进行数据管理,包括数据表与对象的建立,以及增删改查等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:

CoreData是数据库框架,封装了原始的SQLite操作,直接操作对象就可以完成增删改查。

 

一、建立CoreData数据表与对应的数据对象:

1.在创建iOS工程时,在输工程名称与包名的窗口,选中"Use Core Data",如图所示:

2.在打开的工程目录中选中"工程名.xcdatamodeId",在中间视图窗口点底部"Add Entity",增加一个表,如图所示:

在中间视图上面的ENTITIES中会增加一个"Entity",如图所示:

3.在右侧属性面板中修改表名与映射的类名,如图所示:

4.在Attributes中增加表一些字段,如图所示:

5.选中"工程名.xcdatamodeId",点击菜单栏"Editor",在弹出菜单选中"Create NSManagedObject Subclass...",在弹出窗口中一直点"Next",直到创建完成,如图所示:

自动生成的类如图所示:

二、实现增删改查操作:

1.导入依赖包:

//导入CoreData包
#import <CoreData/CoreData.h>
//导入实体类
#import "UserInfo+CoreDataClass.h"
//导入NSPersistentContainer存入类
#import "AppDelegate.h"

2.初始化全局NSManagedObjectContext:

@property (nonatomic, strong) NSManagedObjectContext *dbContext;


/*
 懒加载,初始化全局NSManagedObjectContext
 */
- (NSManagedObjectContext *)dbContext{
    if(_dbContext == nil){
        //1.获取AppDelegate
        AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
        //2.获取NSManagedObjectContext
        _dbContext = appDelegate.persistentContainer.viewContext;
    }
    return _dbContext;
}

3.插入数据:

/*
 插入数据
 */
- (void)insert:(UserInfo *)newInfo{
    // 1.根据表名获取关联对象
    UserInfo *oldInfo = [NSEntityDescription  insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.dbContext];

    //2.给关联对象赋值
    oldInfo.name = newInfo.name;
    oldInfo.age = newInfo.age;
    oldInfo.job = newInfo.job;

    //用于存储插入失败的错误信息
    NSError *error = nil;
    //3.插入数据
    BOOL result = [self.dbContext save:&error];
    if (result) {
        NSLog(@"数据插入成功");
    }else{
        NSLog(@"数据插入失败,错误原因:%@", error);
    }
}

2.更新数据:

/*
 更新数据
 */
- (void)update:(UserInfo *)newInfo{
    //1.设置查询条件
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
    request.predicate = [NSPredicate predicateWithFormat:@"name=%@", newInfo.name];
    
    //2.获取查询列表
    NSArray *oldList = [self.dbContext executeFetchRequest:request error:nil];
    
    //3.更新关联对象
    for (UserInfo *oldInfo in oldList) {
        oldInfo.age = newInfo.age;
        oldInfo.job = newInfo.job;
    }
    
    //用于存储更新失败的错误信息
    NSError *error = nil;
    //4.更新数据
    BOOL result = [self.dbContext save:&error];
    if (result) {
        NSLog(@"数据更新成功");
    }else{
        NSLog(@"数据更新失败,错误原因:%@", error);
    }
}

3.查询数据:

(1)查询所有数据:


 1.1查询:所有数据
 */
- (NSArray *)queryAll{
    //1.设置查询条件
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
    
    //2.设置排序
    request = [self setSortDescriptor:request];
    
    //用于存储查询失败的错误信息
    NSError *error = nil;
    //3.获取查询列表
    NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
    if (!error) {
        NSLog(@"数据查询成功");
        return list;
    }else{
        NSLog(@"数据查询失败,错误原因:%@", error);
    }
    return nil;
}

(2)查询分页数据:

/*
 1.1查询:分页数据
 position:每页开始位置,从0开始
 count:每页条数
 */
- (NSArray *)queryPage:(NSInteger)position count:(NSInteger)count{
    //1.设置查询条件
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
    
    //2.设置每页开始位置
    request.fetchOffset = position;
    
    //3.设置每页条数
    request.fetchLimit = count;
    
    //4.设置排序
    request = [self setSortDescriptor:request];
    
    //用于存储查询失败的错误信息
    NSError *error = nil;
    //5.获取查询列表
    NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
    if (!error) {
        NSLog(@"数据查询成功, 数据列表:%@", list);
        return list;
    }else{
        NSLog(@"数据查询失败,错误原因:%@", error);
    }
    return nil;
}

(3)搜索数据:

/*
 1.1查询:搜索数据
 key:搜索字符串
 */
- (NSArray *)search:(NSString *)searchKey{
    //1.设置查询条件
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
    //创建模糊匹配条件,*为通配符
    NSString *key = [NSString stringWithFormat:@"*%@*", searchKey];
    request.predicate = [NSPredicate predicateWithFormat:@"name like %@", key];
    
    //2.设置排序
    request = [self setSortDescriptor:request];
    
    //用于存储查询失败的错误信息
    NSError *error = nil;
    //3.获取查询列表
    NSArray *list = [self.dbContext executeFetchRequest:request error:&error];
    if (!error) {
        NSLog(@"数据查询成功, 数据列表:%@", list);
        return list;
    }else{
        NSLog(@"数据查询失败,错误原因:%@", error);
    }
    return nil;
}

(4)对查询的列表进行排序:

/*
 1.2设置排序
 */
- (NSFetchRequest *)setSortDescriptor:(NSFetchRequest *)request{
    //1.设置排序条件
    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"name"ascending:YES];
    request.sortDescriptors = @[sd]; //多个排序条件:@[sd1, sd2, sd3]
    return request;
}

4.删除数据:

/*
 删除数据
 */
-(void)deleteInfo:(UserInfo *)info{
    //1.设置查询条件
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"UserInfo"];
    request.predicate = [NSPredicate predicateWithFormat:@"name=%@", info.name];
    
    //2.获取查询列表
    NSArray *list = [self.dbContext executeFetchRequest:request error:nil];
    
    //3.删除数据
    for (UserInfo *info in list) {
        [self.dbContext deleteObject:info];
    }
    
    //用于存储删除失败的错误信息
    NSError *error = nil;
    //4.保存删除结果
    BOOL result = [self.dbContext save:&error];
    if (result) {
        NSLog(@"数据删除成功");
    }else{
        NSLog(@"数据删除失败,错误原因:%@", error);
    }
}

三、测试增删改查:

1.测试插入数据:

/*
 测试插入数据
 */
- (void)testInsert{
    UserInfo *info1 = [[UserInfo alloc] initWithContext:self.dbContext];
    info1.name = @"姓名1";
    info1.age = 26;
    info1.job = @"中级工程师";
    [self insert:info1];
    
    UserInfo *info2 = [[UserInfo alloc] initWithContext:self.dbContext];
    info2.name = @"姓名2";
    info2.age = 28;
    info2.job = @"高级级工程师";
    [self insert:info2];

    UserInfo *info3 = [[UserInfo alloc] initWithContext:self.dbContext];
    info3.name = @"姓名3";
    info3.age = 32;
    info3.job = @"专家工程师";
    [self insert:info3];
}

2.测试更新数据:

/*
 测试更新数据
*/
- (void)testUpdate{
    UserInfo *uObj = [[UserInfo alloc] initWithContext:self.dbContext];
    uObj.name = @"姓名2";
    uObj.job = @"资深工程师";
    [self update:uObj];
}

3.测试查询数据:

/*
 测试查询数据
 */
- (void)testQuery{
    NSArray *list = [self queryAll];
//    NSArray *list = [self queryPage:0 count:10];
//    NSArray *list = [self search:@"姓名2"];
    for (UserInfo *item in list) {
        NSLog(@"name:%@", item.name);
    }
}

4.测试删除数据:

/*
 测试删除数据
 */
- (void)testDelete{
    UserInfo *dObj = [[UserInfo alloc] initWithContext:self.dbContext];
    dObj.name = @"姓名2";
    [self deleteInfo:dObj];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值