zoukankan      html  css  js  c++  java
  • 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 "

     

     

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

  • 相关阅读:
    June 26th 2017 Week 26th Monday
    June 25th 2017 Week 26th Sunday
    June 24th 2017 Week 25th Saturday
    June 23rd 2017 Week 25th Friday
    June 22nd 2017 Week 25th Thursday
    2018最佳网页设计:就是要你灵感爆棚!!!
    图片素材类Web原型制作分享-Pexels
    想要打动HR的心,UX设计师求职信究竟应该怎么写?
    【UXPA大赛企业专访】Mockplus:“设计替代开发”将成为现实
    2018年最好的医疗网站设计及配色赏析
  • 原文地址:https://www.cnblogs.com/qq95230/p/4760852.html
Copyright © 2011-2022 走看看