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 "
< 关于数据库的相关操作大致就这些!>