昆仑山论剑之iOS中(数组,字典,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];

</br>

那会儿,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;
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;

    }

}

</br>

相持于SQLite中的代码建模,CoreData越发简洁.

</br>

开创工程的时候,大家须求手动添加数据库

</br>

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;


    }


}

</br>

作为”增删改查”那七个操作,是大家程序员对数码最大旨的操作,希望我们能够欣赏那篇,如若喜欢就点个赞呗 

字典


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);

}

</br>

SQLite数据库


此处我对上面的Core做了部分简约的下结论
/*
 1.CoreData 是苹果公司封装的数据持久化框架.在iOS3.0中开始开放.
 2.它允许用户按照实体-属性-值模型组织数据,并以二进制,XML,或者sqlite数据文件的格式进行持久化.

 CoreData的优势
 1.他是苹果公司原生态的产品.
 2.他可以节省代码量,大概是30%~70%.
 3.它支持可视化建模.
 4.CoreData 支持数据库版本升级.

 可以通过Editor下的菜单进行生成模型,将Entity生成Model.
 在其过程中有一个选项,勾选,生成的是标量,不勾选,生成的是通量.

 */
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);
}

</br>

引入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;

}
如图添加一个Model

</br>

大家随便做增删改查什么操作,都要先开辟数据库,然后再做相应的操作,
开拓数据库方法解释 :即使数据库不为空,大家就不需求再行创造直接回到,当数据库为空的时候,大家想先找到沙盒对应的路径,然后成立数据库,最终在数据库中开创表格.
//打开数据库
-(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>

在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

</br>

CoreData数据库删除功用

数据库删除效率方法解释: 删除只须要大家把本地的myContext对象中的实体化对象删除掉,然后再保存就行.
-(void)deleteObject{

    //获取当前代表的数据
    Student *stu = self.allData[1];

    //将临时数据库进行删除并进行本地持久化
    [self.myContext  deleteObject:stu];

    [self.myContext save:nil];

}

</br>

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);


}

</br>

相比较于SQLite数据库, CoreData数据库就先绝对的简便了累累,CoreData的落到实处原理你可以想像是github的文件管理一样.你本地是内存,github的服务器是沙盒,你在内存操作完之后就手动传到沙盒中展开本地化保存.其实 CoreData数据库是对SQLite数据库的封装.而且CoreData辅助可视化建模.更是大大收缩了大家的代码量,现在大家就看一下CoreData的兑现步骤以及增删改查作用.

</br>

那里我们成立一个伪单例来囤积大家的SQLite数据库.

数组


在DataBase.h文件大家对创制单例的艺术表明和增删改查的艺术举办完结.

</br>

其实自己想写那篇文章很久了,因为自己做的iOS开发 ,对数码这一块有那极高的须求.所以一些亟须的储存数据的接纳,大家都有要求熟习用法.在以前自己的简书中本身也是写过数额持久化,可是我觉得那一篇是不够完整的,所有我把”增删改查”这几个话题单独拿出来说一下. 今日珍重说4个地方的增删改查,分别是数组,字典,SQLite数据库,CoreData数据.

</br>

模板做好了,上边大家就对SQLite 数据做一些调用了,在调动此前,先把有些常用的SQLite语句,也是SQLite数据库的增删改查功用

</br>

瞩目 :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表明查询多少条结果

</b>

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];


}

</br>

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

</br>

在说”增删改查”以前,我要说一个代码块 ,那个代码块的输入代码是 *** 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#>
    }

</br>

选料生成的门道和变化的Model ,最后大家须要做标量和通量的采纳.

</br>

本人是在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;

}

</br>

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];

}

</br>

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];


}

</br>

字典是基于键值对存储数据的,当然了字典和数组的”增删改查”比较相近,不可变字典是未曾”增删改查”的效果的.唯有可变字典存在”增删改查”;那我们看一下字典中的增删改查是怎样进展的

//根据便利构造器创建一个可变字典
    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(@"栋哥不存在!");
        }
    }

</br>

点击 Create 生成一个Model

</br>

导完了随后,大家率先要有一个Model的沙盘,这里自己就以Student 为类名来成立一个粗略的模板.

</br>

当大家操作完对应的操作后我们必要关闭数据库,代码如下
闭馆数据库方法解释 : 关闭数据库的时候,大家需求调用sqlite3_close()方法,然后把大家的数目库置为nil,这样数据库就完全关闭了.
//关闭数据库
-(void)closeDB{

    int result = sqlite3_close(db);

    //关闭数据库的时候,将db置为空,是因为打开数据库的时候,我们需要使用nil做判断.
    db = nil;

    if (result == SQLITE_OK) {

        NSLog(@"数据库关闭成功!");

    }else{

        NSLog(@"数据库关闭失败:%d",result);

    }

}

</br>


CoreData数据库


当今先把SQL数据库定义在静态区.
static sqlite3 *db =nil;

</br>

俺们在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

SQLite数据库是iOS内嵌的一个数据库,合适大型数据的读写,首要用来地方一些音讯的存储,SQLite数据库采取表结构来储存数据的.我们想在Xcode中应用SQLite数据库,大家就要开端入大家的库.

</br>

我们的生活态度就应当是 “不抱怨” !
网站地图xml地图