• iOS 数据库sqlite完整增删改查操作


    1: 创建数据库表格

     1.1 — 表格创建使用一个数据库软件快速创建 《SQLiteManager》;

           表格创建-> 打开软件,点击第一个 "New SQLite Database" 开始创建表格

     1.2 — 点击保存之后就又一个Student的sql在桌面,然后创建表格,点击上方按钮Database -> Create Table

          为了方便,创建的表格名字和数据库名字一样 Student;添加4个参数,整形、字符串、和数据流类型参数;

           添加完之后拖进项目工程里面就好了。

      2.  —打开和关闭数据库   

    新建工程,创建一个继承NSobject的类,用来封装打开和关闭数据库; 类中导入系统库 sqlite3(要先添加进项目);

    SQLDatas.h 文件
     1 #import <Foundation/Foundation.h>
     2 #import <sqlite3.h>
     3 
     4 @interface SQLDatas : NSObject
     5 
     6 //打开数据库
     7 +(sqlite3 *)openSQL;
     8 
     9 //关闭数据库
    10 +(void)closeSQL;
    11 
    12 @end
    SQLDatas.m 实现文件
     1 #import "SQLDatas.h"
     2 
     3 //定义一个全局数据库
     4 static sqlite3  *mySQL =nil;
     5 
     6 @implementation SQLDatas
     7 
     8 //打开数据库
     9 +(sqlite3 *)openSQL
    10 {
    11     if (mySQL)
    12     {
    13         return mySQL;
    14     }
    15     /**
    16      //将bundle上的数据库转移到沙盒
    17      */
    18     //获取bundle路径 数据库文件名 数据库名和创建的表名一样
    19     NSString *bundlepath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"sqlite"];
    20     //获取沙盒路径
    21     NSString *docupath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    22     //拼接文件完整路径
    23     NSString *filePath =[docupath stringByAppendingPathComponent:@"Student.sqlite"];
    24     
    25     //管理沙盒的对象
    26     NSFileManager *fm =[NSFileManager defaultManager];
    27     
    28     //判断是否已经存在这个文件,如果不存在就拷贝到沙盒
    29     if ([fm fileExistsAtPath:filePath] == NO)
    30     {
    31         [fm copyItemAtPath:bundlepath toPath:filePath error:nil];
    32     }
    33     //打开数据库
    34     sqlite3_open([filePath UTF8String], &mySQL);
    35 
    36     return mySQL;
    37 }
    38 
    39 //关闭数据库
    40 +(void)closeSQL
    41 {
    42     if (mySQL)
    43     {
    44         //置空
    45         mySQL=nil;
    46         sqlite3_close(mySQL);
    47     }
    48 }
    49 
    50 @end

      3.  ——创建数据模型   

     3.1 — 新建一个数据模型  ModetoSQL,我们将数据赋值给模型,再把模型添加进数据库

              ModetoSQL.h 头文件

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface ModetoSQL : NSObject
     4 
     5 @property(assign,nonatomic)int sid;
     6 @property(strong,nonatomic)NSString *name;
     7 @property(assign,nonatomic)int age;
     8 @property(assign,nonatomic)NSData *image;
     9 
    10 //添加信息到数据库
    11 +(BOOL)addInfoToSQL:(ModetoSQL *)stu;
    12 
    13 //查询数据
    14 +(NSMutableArray *)findAllInfo;
    15 
    16 //根据条件查找
    17 +(ModetoSQL *)finByID:(int)ID;
    18 
    19 //删除数据
    20 +(BOOL)deleByID:(int)sid;
    21 
    22 //根据id更新数据库
    23 +(void)updataSQL:(ModetoSQL*)mode;
    24 
    25 @end

       4. 添加数据库  

           ModetoSQL.m 文件

     1 +(BOOL)addInfoToSQL:(ModetoSQL *)stu
     2 {
     3     //1. 打开数据库,返回一个数据库
     4     sqlite3 *mmSQL =[SQLDatas openSQL];
     5     
     6     //2. 创建一个SQL描述对象
     7     sqlite3_stmt *stmt = nil;
     8     
     9     //3. 通过数据库语句进行数据库连接操作 表名括号里的参数要喝表格里的一样 如果result 为1,一般都是此语句错误;
    10     int result= sqlite3_prepare_v2(mmSQL, "insert into Student(sid,name,age,image) values(?,?,?,?)", -1, &stmt, nil);
    11     //如果返回为0,则成功,判断准备语句是否有问题
    12     if (result == SQLITE_OK)
    13     {
    14         //把四个值准备插入 1 2 3 4对应上面的问号
    15         sqlite3_bind_int(stmt, 1, stu.sid);
    16         sqlite3_bind_text(stmt, 2, [stu.name UTF8String], -1, NULL);
    17         sqlite3_bind_int(stmt, 3, stu.age);
    18         //把OC的数据流 转成C语言的二进制流 [stu.imageD bytes]
    19         sqlite3_bind_blob(stmt, 4, [stu.image bytes], (int)[stu.image length],nil);
    20 
    21         //判断操作是否成功
    22         if (SQLITE_DONE == sqlite3_step(stmt))
    23         {
    24             //关闭数据库
    25             [SQLDatas closeSQL];
    26             return YES;
    27         }
    28     }
    29     
    30     //如果不成功 返回NO 关闭数据库
    31     sqlite3_finalize(stmt);
    32     return NO;
    33 }

      添加语句有了以后,我们就在控制器 ViewController 上调用添加一个数据进去。

     1 //创建一个模型对象,并赋值
     2     ModetoSQL *mode =[ModetoSQL new];
     3     mode.sid = 1;
     4     mode.name =@"张三";
     5     mode.age = 23;
     6     //把图片转成数据流 添加一张本地图片01.png,png后缀可以去掉,图片的数据流一般都是网络请求的;
     7     UIImage *img = [UIImage imageNamed:@"01"];
     8     //将图片转换成数据流 压缩0.5
     9     NSData *imgData = UIImageJPEGRepresentation(img, 0.5);
    10     mode.image =imgData;
    11     
    12     //添加到数据库
    13     BOOL isSuc = [ModetoSQL addInfoToSQL:mode];
    14     NSLog(@"%d",isSuc); //打印判断是否成功
    15     
    16     //打印沙盒文件路径 如果不确定数据是否真的添加 可以进入沙盒文件下的Documents查看
    17     NSLog(@"%@",NSHomeDirectory());

         如果之前的语句没有写错,那么就会成功添加一个数据模型到数据库。

         通过打印的沙盒路径找到数据库,打开数据库可以看到添加成功的数据。

          我们不可能每次都打开沙盒查看数据库,所以得用数据库查询语句;

      5. — —查询数据库   

                ModetoSQL.m 

     1 +(NSMutableArray *)findAllInfo
     2 {
     3     //创建接收信息的数组
     4     NSMutableArray *infoArr = [NSMutableArray new];
     5     //1. 打开数据库,返回一个数据库
     6     sqlite3 *mmSQL =[SQLDatas openSQL];
     7     
     8     //2. 创建一个SQL描述对象
     9     sqlite3_stmt *stmt = nil;
    10     
    11     //3. 通过数据库语句进行数据库连接操作
    12     int result =sqlite3_prepare_v2(mmSQL, "select *from Student", -1, &stmt, nil);
    13     if (result == SQLITE_OK)
    14     {
    15         while (SQLITE_ROW == sqlite3_step(stmt))
    16         {
    17             //执行查询操作
    18             ModetoSQL *stu =[ModetoSQL new];
    19             stu.sid =sqlite3_column_int(stmt, 0);//0个位置
    20             //C语言字符串 转OC字符串
    21             stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
    22             stu.age =sqlite3_column_int(stmt, 2);
    23             //将二进制数据流 转OC数据量
    24             stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)];
    25             //添加进数组
    26             [infoArr addObject:stu];
    27         }
    28     }
    29     //关闭数据库
    30     [SQLDatas closeSQL];
    31     return infoArr;
    32 }

    我们在控制器 ViewController 上调用查询语句,这个语句是查询全部数据,返回一个可变数组。

     //查找全部信息 创建可变数组接收
        NSMutableArray *arr = [NSMutableArray new];
        arr = [ModetoSQL findAllInfo];
        //循环遍历 取出
        for (ModetoSQL *mode in arr)
        {
             NSLog(@"%d",mode.sid);
             NSLog(@"%@",mode.name);
             NSLog(@"%d",mode.age);
        }

      有时候我们需要根据某个条件查询数据库,such as sid;我们也可以用其他参数查询

     1 //根据条件查找
     2 +(ModetoSQL *)finByID:(int)sid
     3 {
     4     ModetoSQL *stu =[ModetoSQL new];
     5     //1. 打开数据库,返回一个数据库
     6     sqlite3 *mmSQL =[SQLDatas openSQL];
     7     //2. 创建一个SQL描述对象
     8     sqlite3_stmt *stmt = nil;
     9     //3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
    10     int result = sqlite3_prepare_v2(mmSQL, "select * from Student where sid = ?", -1, &stmt, nil);
    11     if (result == SQLITE_OK)
    12     {
    13         sqlite3_bind_int(stmt, 1, sid); //id在第一个位置
    14         if (SQLITE_ROW == sqlite3_step(stmt))
    15         {
    16             stu.sid =sqlite3_column_int(stmt, 0);
    17             stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
    18             stu.age =sqlite3_column_int(stmt, 2);
    19             //将二进制数据流 转OC数据量
    20             stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)];
    21         }
    22     }
    23     //关闭数据酷
    24     sqlite3_finalize(stmt);
    25     return stu;
    26 }

         上面的按照sid查找的结果, 如果有多个相同的sid,也只是返回一条数据; 只要稍作修改就可以返回全部符合条件的数据,发返回类型改为数组,把里面的if 改为while

     1 //根据条件查找
     2 +(NSMutableArray *)finByID:(int)sid
     3 {
     4     NSMutableArray *arr =[NSMutableArray new];
     5     
     6     //ModetoSQL *stu =[ModetoSQL new];
     7     //1. 打开数据库,返回一个数据库
     8     sqlite3 *mmSQL =[SQLDatas openSQL];
     9     //2. 创建一个SQL描述对象
    10     sqlite3_stmt *stmt = nil;
    11     //3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
    12     int result = sqlite3_prepare_v2(mmSQL, "select * from Student where sid = ?", -1, &stmt, nil);
    13     if (result == SQLITE_OK)
    14     {
    15         sqlite3_bind_int(stmt, 1, sid); //id在第一个位置
    16         
    17         while (SQLITE_ROW == sqlite3_step(stmt))
    18         {   ModetoSQL *stu = [ModetoSQL new];
    19             stu.sid =sqlite3_column_int(stmt, 0);
    20             stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
    21             stu.age =sqlite3_column_int(stmt, 2);
    22             //将二进制数据流 转OC数据量
    23             stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)];
    24             [arr addObject:stu];
    25         }
    26     }
    27     //关闭数据酷
    28     sqlite3_finalize(stmt);
    29     return arr;
    30 }

     6. — —删除数据库   

        接下来就是删除数据了,根据 sid删除;

     1 //1. 打开数据库,返回一个数据库
     2     sqlite3 *mmSQL =[SQLDatas openSQL];
     3     //2. 创建一个SQL描述对象
     4     sqlite3_stmt *stmt = nil;
     5     //3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
     6     int result =sqlite3_prepare_v2(mmSQL, "delete from Student where sid= ?", -1, &stmt, nil);
     7     if (result== SQLITE_OK)
     8     {
     9         sqlite3_bind_int(stmt, 1, sid);
    10         if (SQLITE_DONE== sqlite3_step(stmt))
    11         {
    12             return YES;
    13         }
    14     }
    15     //关闭数据库
    16     sqlite3_finalize(stmt);
    17     return NO;

         7. — —修改数据库    

          最后一个根据参数修改数据库,因为我们存进去的是一个模型,所以我们修改的时候页是根据模型修改

     1 //根据sid更新数据库
     2 +(void)updataSQL:(ModetoSQL *)mode
     3 {
     4     //1. 打开数据库,返回一个数据库
     5     sqlite3 *mmSQL =[SQLDatas openSQL];
     6     //2. 创建一个SQL描述对象
     7     sqlite3_stmt *stmt = nil;
     8     //3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
     9     int result =sqlite3_prepare_v2(mmSQL, "update Student set  name = ? ,age = ? ,image = ? where sid = ?", -1, &stmt, nil);
    10     
    11     if (result ==SQLITE_OK)
    12     {
    13         //数字必须和问号顺序相对应;
    14         sqlite3_bind_int(stmt, 4, mode.sid);
    15         sqlite3_bind_text(stmt, 1, [mode.name UTF8String], -1, nil);
    16         sqlite3_bind_int(stmt, 2, mode.age);
    17         sqlite3_bind_blob(stmt, 3, [mode.image bytes], (int)[mode.image length], nil);
    18         if (sqlite3_step(stmt) == SQLITE_DONE)
    19         {
    20   
    21         }
    22     }
    23     sqlite3_finalize(stmt); //关闭数据库
    24 }

    根据两个参数修改其中的值"  update gooodsInfo set number = 11 where goodsid = 19  and  price = 66 "

     

     

          < 关于数据库的相关操作大致就这些!>

  • 相关阅读:
    linux中你会新建复制移动删除文件或目录吗?三分钟搞懂【文件管理】
    从此英语渣渣也能看懂man手册-【linux man手册汉化安装使用教程】
    你真的会用ls命令吗?--文件管理命令(ls命令详解)
    Python算法系列—深度优先遍历算法【二叉树】
    Python算法系列-单词匹配模式【hash练习】
    abp 从4.3升级到5.4 从入门到放弃
    ABP core2.2错误笔记2,持续更新
    echart报错: Component series.XXX not exists. Load it first
    单例模式MQTT服务为什么会重复收到消息
    在ABP core中使用RabbitMq
  • 原文地址:https://www.cnblogs.com/qq95230/p/4760852.html
Copyright © 2020-2023  润新知