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 "

 

 

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

 

posted @ 2015-08-26 22:08  wq95230  阅读(1726)  评论(0编辑  收藏  举报