博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
coreData的使用
阅读量:4080 次
发布时间:2019-05-25

本文共 5697 字,大约阅读时间需要 18 分钟。

 1.#import <CoreData/CoreData.h>
 2.创建CoreData的数据模型文件(类似于数据库的创建表)
    这样托管对象模型知道所有当前工程中用到的托管对象的定义
    创建一个NSManagedObjectModel 数据模型文件
 
 //1.创建数据模型文件-》new file->core Data--》选中Data Model,创建文件 (User.xcdatamodeld)在里面创建 数据模型实例Entity(UserModel)
 //2.创建跟数据模型文件关联的数据模型类new file->core Data->选中 NSManagedObject of subclass --》关联上User.xcdatamodeld数据模型文件中的UserModel 实例
 //3.用代码初始化CoreData
 //3.1 导入 #import <CoreData/CoreData.h>
 //3.2 从沙盒包内 读取数据模型文件
 有两种方式:
 a.//获取到coreData文件的路径,并转换成url
 //在包内User.xcdatamodeld会转化为 User.momd
 
 NSString *coreDataPath  =[[NSBundle mainBundle] pathForResource:@"User" ofType:@"momd"];
 //加载coreData文件中的数据,转成model
 NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:coreDataPath]];
 
 b.NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
 中的nil表示连接项目中所有的 .xcdatamodeld 文件为一个datamodel,这是一个非常好的方法,把多个entity放在各自的xcodemodel文件中分开管理,然后用这个函数连接起来生成一个datamodel,这样就可以对应一个persistentStore。
//NSLog(@"data:%@",[[NSBundle mainBundle] pathForResource:@"User" ofType:@"momd"]);
//3.2获取 数据模型文件
3.创建协调器
NSPersistentStoreCoordinator
4.//将coreData数据映射到数据库
addPersistentStoreWithType
5.//创建上下文托管对象
NSManagedObjectContext

6增删改查

-------------------------------------------------------------

#import "RootViewController.h"
#import <CoreData/CoreData.h>
#import "UserModel.h"
@interface RootViewController () <UITableViewDataSource,UITableViewDelegate>
@property (nonatomic,strong) NSManagedObjectContext *context;
@property (nonatomic ,strong) NSMutableArray *dataArray;
@property (weak, nonatomic) IBOutlet UITextField *nameTF;
@property (weak, nonatomic) IBOutlet UITextField *ageTF;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
@implementation RootViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.dataArray=[[NSMutableArray alloc] init];
    self.tableView.delegate=self;
    self.tableView.dataSource=self;
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    [self initCoreData];
}
#pragma mark - 初始化CoreData
-(void)initCoreData{
    //1、获取.xcdatamodeld  读成一个数据模型文件对象
#if 1
    NSManagedObjectModel *fileModel=[NSManagedObjectModel mergedModelFromBundles:nil];
#else
    NSString *path=[[NSBundle mainBundle] pathForResource:@"User" ofType:@"momd"];
    NSManagedObjectModel *fileModel=[[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path]];
#endif
    
    //2、设置存储协调器
    //2.1.创建协调器,关联model
    NSPersistentStoreCoordinator *coordinator=[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:fileModel];
    //2.2.设置一个数据库存储的地址
    NSString *dataPath=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/myData.sqlite"];
    //2.3.设置数据存储类型(设置为数据库:NSSQLiteStoreType)
    NSError *error=nil;
    NSPersistentStore *store=[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dataPath] options:nil error:&error];
    if (!store) {
        NSLog(@"%@",error.description);
    }
    
    //3、创建上下文管理对象(对数据库进行增删改查) 关联协调器
    self.context=[[NSManagedObjectContext alloc] init];
    self.context.persistentStoreCoordinator=coordinator;//设置协调器
}
- (IBAction)addClick:(id)sender {
    //增加一个数据模型对象,通过上下文去向数据库中添加UserModel对象
    UserModel *model=(UserModel *)[NSEntityDescription insertNewObjectForEntityForName:@"UserModel" inManagedObjectContext:self.context];
    model.name=self.nameTF.text;
    model.fName=[self.nameTF.text substringToIndex:1];
    model.age=@(self.ageTF.text.integerValue);
    
    //把数据保存到本地(注意:一定要保存,保存后才会写入磁盘)
    NSError *error=nil;
    BOOL ret=[self.context save:&error];
    if (!ret) {
        NSLog(@"insert data error %@",error.description);
    }
}
- (IBAction)deleteClick:(id)sender {
    NSArray *ary=[self fetchDataWithName:self.nameTF.text];
    for (UserModel *model in ary) {
        [self.context deleteObject:model];
    }
    NSError *error=nil;
    if (![self.context save:&error]) {
        NSLog(@"delete error %@",error.description);
    }
}
- (IBAction)updateClick:(id)sender {
    NSArray *ary=[self fetchDataWithName:self.nameTF.text];
    for (UserModel *model in ary) {
        model.age=@(self.ageTF.text.integerValue);
    }
    NSError *error=nil;
    if (![self.context save:&error]) {
        NSLog(@"update error %@",error.description);
    }
}
- (IBAction)fetchNameClick:(id)sender {
    NSArray *ary=[self fetchDataWithName:self.nameTF.text];
    [self.dataArray removeAllObjects];
    [self.dataArray addObjectsFromArray:ary];
    [self.tableView reloadData];
}
- (IBAction)fetchAll:(id)sender {
    NSArray *ary=[self fetchDataWithName:nil];
    [self.dataArray removeAllObjects];
    [self.dataArray addObjectsFromArray:ary];
    [self.tableView reloadData];
}
-(NSArray *)fetchDataWithName:(NSString *)name{
    //1、实例化一个查询请求
    NSFetchRequest *request=[[NSFetchRequest alloc] init];
    //2、设置要查询的数据模型
    request.entity=[NSEntityDescription entityForName:@"UserModel" inManagedObjectContext:self.context];
    //设置谓词,用于过滤数据,设置搜索条件
    if (name) {
        request.predicate=[NSPredicate predicateWithFormat:@"name like %@",name];
    }
    //排序
    NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
    request.sortDescriptors=@[sort];
    return  [self.context executeFetchRequest:request error:nil];
}
#pragma mark - tableViewDelegate
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _dataArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    UserModel *model=self.dataArray[indexPath.row];
    cell.textLabel.text=[NSString stringWithFormat:@"name:%@,age:%@",model.name,model.age];
    return cell;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

转载地址:http://bjsni.baihongyu.com/

你可能感兴趣的文章
【无人机开发】通讯协议MavLink详解
查看>>
B站这个讲mavlink的视频不错(弄懂了很多东西)
查看>>
*我发觉不管是mavlink还是传感器驱动都是基于串口协议的一个更高层的协议!!!!!!!(没有协议没有规则是没有办法进行通信的)
查看>>
STM32控制APM飞控(四)MAVLINK协议深入理解之数据结构
查看>>
STM32控制APM飞控(五)MAVLINK的C源码的解释及MAVLINK心跳包
查看>>
STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中
查看>>
STM32下mavlink的使用个人总结(包含对ACfly里面mavlink的分析,包含接收T265的位置信息的二次开发教程)
查看>>
MAVLink通讯协议在STM32上移植,并自定义协议(这篇还写了在STM32上怎么收发数据,调用哪些函数)
查看>>
结构体在STM32串口接收中的妙用
查看>>
mavlink协议发送与接收--串口版(这篇也讲了STM32上面用哪些函数收发)
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
TBUS可能是我目前真正实际视频见到的室内无人机做得最优秀的。
查看>>
我看他们不是弄了一个无人机降落的算法,我觉得你解决一个无人机抗磁干扰的也可以发论文啊。
查看>>
TBUS的无人机为了提升拉力是用的上下两个电机的无人机。
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>