美文网首页ios框架数据库iOS数据持久化
华山论剑之iOS中(数组,字典,SQLite,CoreData)

华山论剑之iOS中(数组,字典,SQLite,CoreData)

作者: 神经骚栋 | 来源:发表于2016-03-11 11:49 被阅读1233次
    我们的生活态度就应该是 "不抱怨" !

    其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我的简书中我也是写过数据持久化,但是我觉得那一篇是不够完整的,所有我把"增删改查"这个话题单独拿出来说一下. 今天主要说4个方面的增删改查,分别是数组,字典,SQLite数据库,CoreData数据.

    数组


    首先说一下数组的增删改查.数组结构是我们做开发中经常使用的一种结构.然后看一下数组的"增删改查"是如何进行的吧.当然了,我们要事项说明一点,就是数组分为可变数组,和不可变数组.不可变数组是没有增删改查的,所有我们只会对可变数组的增删改查进行研究.当然了.字典也是一样的.

    
        //使用便利构造器创建一个可变数组
        NSMutableArray *mtuArray = [NSMutableArray array];
        
        //增
        //给数组增加一些元素
        [mtuArray addObject:@"栋哥"];
        
        //给数组中添加一个数组
        [mtuArray addObjectsFromArray:@[@"强哥",@"其弟"]];
      
        
        //改
        //根据下标修改某个值
        mtuArray[1] = @"萌神";
        
        //查
        if ([mtuArray containsObject:@"栋哥"]) {
            
            NSLog(@"存在栋哥!");
            
        }else{
        
            NSLog(@"栋哥不知道去哪了?");
        
        }
        
        
        //删
        //删除数组某一个元素
        [mtuArray removeObject:@"栋哥"];
        
        //根据下标删除数组的某一个元素
        [mtuArray removeObjectAtIndex:1];
        
        //删除所有的元素
        [mtuArray removeAllObjects];
        
        //删除最后一个元素
        [mtuArray removeLastObject];
        
    

    字典


    字典是根据键值对存储数据的,当然了字典和数组的"增删改查"比较类似,不可变字典是没有"增删改查"的功能的.只有可变字典存在"增删改查";那我们看一下字典中的增删改查是如何进行的

    //根据便利构造器创建一个可变字典
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        
        //增
        //添加单个键值对
        [dic setObject:@"栋哥" forKey:@"菜比"];
        
        //添加一个不可变字典
        [dic setDictionary:@{@"大神":@"其弟"}];
        
        //删
        //删除某一个键值对
        [dic removeObjectForKey:@"大神"];
        
        //删除字典中的所有元素
        [dic removeAllObjects];
        
        //改
        //改变某个键的值
        dic[@"菜比"] = @"面面";
        
        
        //查
        //注意:字典遍历一遍是在遍历所有的键,我们需要比对键的值来查找某个元素
        for (NSString *key in [dic allKeys]) {
            
            if ([dic[key] isEqualToString:@"栋哥"]) {
                
                NSLog(@"栋哥存在了!");
                
            }else{
                NSLog(@"栋哥不存在!");
            }
        }
    
    

    SQLite数据库


    SQLite数据库是iOS内嵌的一个数据库,合适大型数据的读写,主要用于本地一些信息的存储,SQLite数据库采用表结构来存储数据的.我们想在Xcode中使用SQLite数据库,我们就要先导入我们的库.

    导完了之后,我们首先要有一个Model的模板,这里我就以Student 为类名来创建一个简单的模板.

    我们在Student.h文件中是这样写的.

    #import <Foundation/Foundation.h>
    
    @interface Student : NSObject
    
    @property(nonatomic,strong)NSString *name;
    
    @property(nonatomic,strong)NSString *gender;
    
    @property(nonatomic,assign)int Stu_ID;
    
    @property(nonatomic,assign)int age;
    
    -(instancetype)initWithName:(NSString *)name
                         gender:(NSString *)gender
                          stuID:(int)stuID
                            age:(int)age;
    @end
    
    
    

    Student.m是这样写的,都是很简单的

    -(instancetype)initWithName:(NSString *)name
                         gender:(NSString *)gender
                          stuID:(int)stuID
                            age:(int)age{
        
        if (self = [super init]) {
            
            _age = age;
            
            _name = name;
            
            _gender = gender;
            
            _Stu_ID = stuID;
            
        }
        
        return self;
    
    }
    
    
    -(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    
    }
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"%@", _name];
    }
    
    
    @end
    

    模板做好了,下面我们就对SQLite 数据做一些调用了,在调动之前,先把一些常用的SQLite语句,也是SQLite数据库的增删改查功能

    注意 :SQLite语句比较容易出错,所以我建议大家尽量全都复制黏贴,不要用手敲SQLite 语句!!
    //创建表
    
    CREATE TABLE "Class43" ("Stu_ID" INTEGER PRIMARY KEY NOT NULL UNIQUE, "name" TEXT NOT NULL, "gender" TEXT NOT NULL DEFAULT M, "age" INTEGER NOT NULL);
    
    //添加
    
    //方式1(字段和值一一对应(局部添加))
    INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (2,'栋哥','男',18)
    
    //方式2 (整体赋值)(插入数据的时候需要和表里面的顺序一样)
    INSERT INTO Class43 VALUES (3,'栋哥','男',17)
    
    
    //修改
    
    //方式1整体修改(没有指定指定关键字,则修改全部)
    UPDATE Class43 SET age = 18
    
    //方式2 局部修改
    UPDATE Class43 SET age = 18  WHERE  name ='骚栋'
    
    
    // 查询
    
    //方式1查询全部
    SELECT * FROM Class43 
    
    //方式2 局部查询
    SELECT * FROM Class43  WHERE name = '栋哥'
    
    
    //删除
    
    //方式1 局部变量
    DELETE FROM Class43 WHERE Stu_ID = 3
    
    //方式2 全局变量
    DELETE FROM Class43 
    
    //删除表
    DROP TABLE Class43
    
    
    //查找
    select * from users order by id limit 1 offset 0
    
    offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果
    
    

    这里我们创建一个伪单例来存储我们的SQLite数据库.

    在DataBase.h文件我们做导入sqlite3库 , 创建单例的方法声明和增删改查的方法声明.

    #import <Foundation/Foundation.h>
    
    #import <sqlite3.h>
    
    @class Student;
    
    @interface DataBase : NSObject
    
    //创建单例
    +(instancetype)shareDataBase;
    
    //打开数据库
    -(void)openDB;
    
    //关闭数据库
    -(void)closeDB;
    
    //添加
    -(void)insertStudent:(Student *)student;
    
    //删除
    -(void)deleteStudent:(int)studentID;
    
    //修改
    -(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id;
    
    //查询全部
    -(NSArray <Student *> *)selectAllStudent;
    
    //查询单个学生
    -(Student *)selectStudent:(int)Stu_ID;
    
    
    @end
    
    

    在DataBase.h文件我们对创建单例的方法声明和增删改查的方法进行实现.

    引入Model文件, 实现单例初始化方法.

    #import "DataBase.h"
    
    #import "Student.h"
    
    @implementation DataBase
    
    static DataBase *dataBase = nil;
    
    +(instancetype)shareDataBase{
    
        //加锁(多线程)
        @synchronized(self) {
            
            if (nil == dataBase) {
                
                dataBase = [[DataBase alloc]init];
                
                //打开数据库
                [dataBase openDB];
            }
            
        }
        
        return dataBase;
        
    }
    
    

    现在先把SQL数据库定义在静态区.

    static sqlite3 *db =nil;
    

    我们不管做增删改查什么操作,都要先打开数据库,然后再做对应的操作.

    打开数据库方法解释 :如果数据库不为空,我们就不需要重新创建直接返回,当数据库为空的时候,我们想先找到沙盒对应的路径,然后创建数据库,最后在数据库中创建表格.
    //打开数据库
    -(void)openDB{
        
        //如果数据库已经打开,则不需要执行后面的操作
        if (db != nil) {
            
            return;
            
        }
        
    
        //创建保存数据库的路径
        NSString *docmsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        
        docmsPath = [docmsPath stringByAppendingString:@"/LOClass.sqlite"];
        
        NSLog(@"%@",docmsPath);
        //打开数据库(如果该数据库存在,则直接打开,否则,会自动创建一个再打开)
       int result =  sqlite3_open([docmsPath UTF8String], &db);
    
        if (result == SQLITE_OK) {
            
            NSLog(@"数据库成功打开");
            
            //建表
            //1.准备SQL语句
            NSString *sql = @"CREATE TABLE Class43 (Stu_ID INTEGER PRIMARY KEY NOT NULL UNIQUE, name TEXT NOT NULL, gender TEXT NOT NULL DEFAULT M, age INTEGER NOT NULL);";
            
            //2.执行语句
            sqlite3_exec(db, [sql UTF8String], nil, nil, nil);
            
        }else{
        
            NSLog(@"%d",result);
        }
    
    }
    
    

    </br>

    当我们操作完对应的操作后我们需要关闭数据库,代码如下
    关闭数据库方法解释 : 关闭数据库的时候,我们需要调用sqlite3_close()方法,然后把我们的数据库置为nil,这样数据库就完全关闭了.
    //关闭数据库
    -(void)closeDB{
    
        int result = sqlite3_close(db);
        
        //关闭数据库的时候,将db置为空,是因为打开数据库的时候,我们需要使用nil做判断.
        db = nil;
        
        if (result == SQLITE_OK) {
            
            NSLog(@"数据库关闭成功!");
                   
        }else{
        
            NSLog(@"数据库关闭失败:%d",result);
            
        }
      
    }
    
    
    SQL数据库增加功能
    增添方法的解释: 首先我们需要打开数据库,然后创建跟随指针,跟随指针的作用可以理解为绑定一个完整Model数据到要执行的SQLite语句上,然后再对这个Model进行操作.然后创建SQLite语句并运行,当我们的SQLi特语句执行成功的时候,这时候跟随指针就绑定Model ,然后单步执行.最后要释放到跟随指针.
    /添加
    -(void)insertStudent:(Student *)student{
    
        //1.打开数据库
        [self openDB];
        
        //2.创建跟随指针
        sqlite3_stmt *stmt = nil;
        
        //3.准备sql语句
        NSString *sql =@"INSERT INTO Class43(Stu_ID,name,gender,age) VALUES (?,?,?,?)";
        
        //4.验证sql语句的正确性
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        
        //5.判断 并且绑定
        if (result == SQLITE_OK) {
            
            NSLog(@"数据库添加成功");
            
            //一旦sql语句没有问题就开始绑定数据,替换问号
            //参数:(1)跟随指针 (2)问号的顺序呢(从1开始) (3)要绑定的值
            sqlite3_bind_int(stmt, 1, student.Stu_ID);
            
            sqlite3_bind_text(stmt, 2, [student.name UTF8String], -1, nil);
            
            sqlite3_bind_text(stmt, 3, [student.gender UTF8String], -1, nil);
            
            sqlite3_bind_int(stmt, 4, student.age);
            
            //6.单步执行
            sqlite3_step(stmt);
            
        }else{
        
            NSLog(@"数据库添加失败:%d",result);
        
        }
    
        
        //释放跟随指针占用的内存
        sqlite3_finalize(stmt);
    
    
    }
    
    SQL数据库删除功能
    删除方法的解释: 首先我们需要打开数据库,然后创建跟随指针,然后创建删除的SQL语句并执行,当执行成功之后,我们就会让跟随指针绑定我们的删除条件,然后单步执行. 执行完成之后,我们需要手动释放跟随指针.
    //删除
    -(void)deleteStudent:(int)studentID{
    
        [self openDB];
        
        //创建跟随指针
        sqlite3_stmt *stmt = nil;
        
        //准备sql语句
        NSString *sql = @"DELETE FROM Class43 WHERE Stu_ID = ?";
        
        //验证正确与否
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        
        //开始删除
        if (result == SQLITE_OK) {
            
            //开始绑定
            sqlite3_bind_int(stmt, 1, studentID);
            
            
            //单步执行
            sqlite3_step(stmt);
            
            NSLog(@"删除成功");
            
        }else{
        
            NSLog(@"删除失败");
        
        }
        
        //释放
        sqlite3_finalize(stmt);
    
    }
    
    
    SQL数据库修改功能
    修改方法的解释: 首先我们需要打开数据库,然后再创建跟随指针,创建跟随指针完成之后,我们需要创建我们的SQL语句并执行,如果执行成功,我们就让我们的跟随指针绑定我们的筛选条件,然后单步执行,最后释放我们的跟随指针.
    //修改
    -(void)upDateStudentWithGender:(NSString *)gender andStuID:(int)stu_id{
    
        
        [self openDB];
        
        sqlite3_stmt *stmt = nil;
        
        NSString *sql = @"UPDATE Class43 SET gender = ?  WHERE  Stu_ID = ?";
        
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            
            NSLog(@"修改成功");
            
            sqlite3_bind_int(stmt, 2, stu_id);
            
            sqlite3_bind_text(stmt, 1, [gender UTF8String], -1, nil);
            
            sqlite3_step(stmt);
            
            
        }else{
        
            NSLog(@"修改失败");
        
        }
    
        //释放
        sqlite3_finalize(stmt);
    }
    
    SQL数据库查询整个表格功能
    查询全部方法的解释:首先打开我们的数据库,创建跟随指针,创建完成之后,我们就创建我们的SQL语句并执行.如果执行成功的话,我们就使用while循环反复执行我们的语句,根据sql语句将搜索到的符合条件的值取出来并绑定我们的跟随指针,然后把查询到的数据存到数组中,最后不管是否查询成功,都要释放我们的跟随指针.
    -(NSArray<Student *> *)selectAllStudent{
    
        [self openDB];
        
        sqlite3_stmt *stmt = nil;
        
        NSString *sql = @"SELECT * FROM Class43";
        
        int result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            
            NSLog(@"查询成功!");
            
            //创建可变数组用来存放查询到的学生
            NSMutableArray *array = [NSMutableArray array];
            
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                
                //根据sql语句将搜索到的符合条件的值取出来(0 代表数据库表的第一列);
                int stu_id = sqlite3_column_int(stmt, 0);
                
                NSString *name =[NSString stringWithUTF8String: (const char *)sqlite3_column_text(stmt, 1)];
                
                NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
                
                int age = sqlite3_column_int(stmt, 3);
                
                //将取出来的信息赋值给学生的model
                Student *student = [[Student alloc]initWithName:name gender:gender stuID:stu_id age:age];
                
                [array addObject:student];
                
                
            }
            
            
            sqlite3_finalize(stmt);
            
            return array;
            
        }else{
        
            NSLog(@"查询失败!");
            
            
            sqlite3_finalize(stmt);
            
            return nil;
            
            
        }
        
     
    }
    
    
    SQL数据库查询单个表格功能
    查询单个方法的解释:首先打开我们的数据库,创建跟随指针,创建完成之后,我们就创建我们的SQL语句并执行.如果执行成功的话,我们就使用while循环反复执行我们的语句,根据sql语句将搜索到的符合条件的值取出来并绑定我们的跟随指针,然后把查询到的数据存到对应Model中,最后不管是否查询成功,都要释放我们的跟随指针.
    //查询单个学生
    -(Student *)selectStudent:(int)Stu_ID{
    
        //打开数据库
        [self openDB];
        
        //创建跟随指针
        sqlite3_stmt *stmt = nil;
        
        //准备sql语句
        NSString *sql = @"SELECT * FROM Class43  WHERE Stu_ID = ?";
        
        //验证
        int  result = sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil);
        
        if (result == SQLITE_OK) {
            
            NSLog(@"查询成功!");
            
            //绑定
            sqlite3_bind_int(stmt, 1, Stu_ID);
            
            Student *stu =[Student new];
            
            //执行
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                
                stu.Stu_ID = sqlite3_column_int(stmt, 0);
                
                stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
                
                stu.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 2)];
                
                stu.age = sqlite3_column_int(stmt, 3);
                    
            }
            
            sqlite3_finalize(stmt);
            
            return stu;
              
        }else{
        
            NSLog(@"查询失败:%d",result);
            
            sqlite3_finalize(stmt);
            
            return nil;
        
        }
        
    }
    
    

    CoreData数据库


    相比于SQLite数据库, CoreData数据库就先相对的简单了许多,CoreData的实现原理你可以想象是github的文件管理一样.你本地是内存,github的服务器是沙盒,你在内存操作完之后就手动传到沙盒中进行本地化保存.其实 CoreData数据库是对SQLite数据库的封装.而且CoreData支持可视化建模.更是大大减少了我们的代码量,现在我们就看一下CoreData的实现步骤以及增删改查功能.

    创建工程的时候,我们需要手动添加数据库

    这时候,Xcode会自动帮助我们在AppDelegate里面生成几个额外的属性.属性的解释如下

    //被管理对象上下文,相当于一个临时数据库,我们存储或者查询都是通过这个对象来进行的.
    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    
    //被管理对象模型,可以简单的理解为可视化建模文件.我们在可视化建模中是Entity,自动生成Model,就是这个对象.方便让文件存储助理进行管理.
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
    
    //文件存储助理,他是CoreData的核心.他负责连接所有的模块,包括真实的存储文件.
    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    //将我们在内存中的操作进行持久化.
    - (void)saveContext;
    //获取真实文件的路径.
    - (NSURL *)applicationDocumentsDirectory;
    
    

    这里我对上面的Core做了一些简单的总结

    /*
     1.CoreData 是苹果公司封装的数据持久化框架.在iOS3.0中开始开放.
     2.它允许用户按照实体-属性-值模型组织数据,并以二进制,XML,或者sqlite数据文件的格式进行持久化.
     
     CoreData的优势
     1.他是苹果公司原生态的产品.
     2.他可以节省代码量,大概是30%~70%.
     3.它支持可视化建模.
     4.CoreData 支持数据库版本升级.
     
     可以通过Editor下的菜单进行生成模型,将Entity生成Model.
     在其过程中有一个选项,勾选,生成的是标量,不勾选,生成的是通量.
    
     */
    

    相对于SQLite中的代码建模,CoreData更加简洁.

    如图添加一个Model

    点击 Create 生成一个Model

    选择生成的路径和生成的Model ,最后我们需要做标量和通量的选择.

    在说"增删改查"之前,我要说一个代码块 ,这个代码块的输入代码是 *** fetch - Core Data Fetch*** 代码块如下,这就是我们要从沙盒中搬到内存的数据,当然了,我们需要做一些谓词筛选等,下面的增删改查中会用到.查询到的结果就在fetchedObjects这个数组中存储着.

     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:<#context#>];
        [fetchRequest setEntity:entity];
        // Specify criteria for filtering which objects to fetch
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"<#format string#>", <#arguments#>];
        [fetchRequest setPredicate:predicate];
        // Specify how the fetched objects should be sorted
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#key#>"
                                                                       ascending:YES];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
        
        NSError *error = nil;
        NSArray *fetchedObjects = [<#context#> executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects == nil) {
            <#Error handling code#>
        }
    
    

    我是在ViewController做一些"增删改查"的操作,首先我们需要声明两个属性,一个是联系上下文的对象是一个用于保存数据的数组,首先,我们会在ViewDidLoad进行初始化一下.

    #import "ViewController.h"
    
    #import "AppDelegate.h"
    
    #import "Student.h"
    
    @interface ViewController ()
    
    //创建一个上下文对象,用于处理所有与存储相关的请求.
    @property(nonatomic,strong)NSManagedObjectContext *myContext;
    
    //创建一个数组,用于存储数组的数据源.
    @property(nonatomic,strong)NSMutableArray *allData;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        //进行数据初始化
        self.allData = [ NSMutableArray array];
        
        AppDelegate *dele = [UIApplication sharedApplication].delegate;
        
        self.myContext = dele.managedObjectContext;
    
    }
    
    
    CoreData数据库增添功能

    ####### 数据库增添功能方法解释: 首先我们需要创建一个实体描述对象然后存到联系上下文对象中,给这个实体描述对象进行赋值. 再由NSManagedObjectContext对象进行本地化存储.

    -(void)addObject{
    
        //1.创建Student对象
        
        //创建一个实体描述对象
        NSEntityDescription *description = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];
        
        Student *stu = [[Student alloc]initWithEntity:description insertIntoManagedObjectContext:self.myContext];
        //给属性赋值
        
        stu.name = @"张三";
        
        stu.age = arc4random()%73+1;
        
        [self.allData addObject:stu];
        
        //本地化保存
        AppDelegate *dele = [UIApplication sharedApplication].delegate;
        
        [dele saveContext];
    
    
    }
    
    
    CoreData数据库删除功能

    ####### 数据库删除功能方法解释: 删除只需要我们把本地的myContext对象中的实体化对象删除掉,然后再保存就行.

    -(void)deleteObject{
    
        //获取当前代表的数据
        Student *stu = self.allData[1];
        
        //将临时数据库进行删除并进行本地持久化
        [self.myContext  deleteObject:stu];
        
        [self.myContext save:nil];
    
    }
    
    CoreData数据库修改功能

    ####### 数据库修改功能方法解释: 首先我们需要把沙盒中的数据表格更新到我们的内存对象myContext中去,然后修改实例化对象的值,然后保存到数组,中,最后在进行数据持久化操作.

     -(void)upDataObject{
    
        //先查询
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];
        [fetchRequest setEntity:entity];
        // Specify criteria for filtering which objects to fetch
        
        //  how the fetched objects should be sorted
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"
                                                                       ascending:YES];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
        
        NSError *error = nil;
        NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects == nil) {
            
            
        }
        //修改对对应的数据
        Student *stu  = self.allData[1];
        stu.name = @"尼古拉斯-赵四";
        //更新数据源
        [self.allData removeAllObjects];
        [self.allData addObjectsFromArray:fetchedObjects];
        
        //将修改本地持久化
        [self.myContext save:nil];
    
    
    }
    
    CoreData数据库查询功能
    数据库查询功能方法解释: 这里只做整体的查询,当我们需要查询某个数据的时候,我们就要先从山河中下载到内存中,然后保存到我们的数组中.在对数组进行遍历操作,查询我们的对象.
    -(void)selectAllData{
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.myContext];
        [fetchRequest setEntity:entity];
        // Specify criteria for filtering which objects to fetch
        
        // Specify how the fetched objects should be sorted
        //排序条件
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age"
                                                                       ascending:YES];
        [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
        
        NSError *error = nil;
        NSArray *fetchedObjects = [self.myContext executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects == nil) {
            
            NSLog(@"两手空空,你让我拿什么飞天?");
            
        }
        
        //将查询到的数据添加到数据源
        [self.allData addObjectsFromArray:fetchedObjects];
    
    }
    
    

    作为"增删改查"这四个操作,是我们程序员对数据最基本的操作,希望大家能够喜欢这篇,如果喜欢就点个赞呗 😃

    相关文章

      网友评论

      • 雷鸣1010:了解底层原理很重要
        神经骚栋: @雷鸣1010 嗯嗯
      • 05928c0c7c63:为什么不用Fmdb第三方,非得自己写(⊙o⊙)
        神经骚栋: @樱空释的爱1 不是说别人的就不好,而是我们既要会使用,又明白原理,岂不是更好…!😂😂😂😂
        05928c0c7c63: @神经骚栋 我是渣渣,我信奉的是别人实践过的就是好的😄
        神经骚栋:@樱空释的爱1 我们在工作中是可以用FMDB 但是那毕竟是别人的,我们何不研究一下实现原理呢?那样岂不是更好一点?是不是呀,大牛? :smile: :smile: :smile:

      本文标题:华山论剑之iOS中(数组,字典,SQLite,CoreData)

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