1: 创建数据库表格
1.1 — 表格创建使用一个数据库软件快速创建 《SQLiteManager》;
表格创建-> 打开软件,点击第一个 "New SQLite Database" 开始创建表格
1.2 — 点击保存之后就又一个Student的sql在桌面,然后创建表格,点击上方按钮Database -> Create Table
为了方便,创建的表格名字和数据库名字一样 Student;添加4个参数,整形、字符串、和数据流类型参数;
添加完之后拖进项目工程里面就好了。
2. —打开和关闭数据库
新建工程,创建一个继承NSobject的类,用来封装打开和关闭数据库; 类中导入系统库 sqlite3(要先添加进项目);
SQLDatas.h 文件
1 #import
2 #import
3
4 @interfaceSQLDatas : NSObject5
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 @implementationSQLDatas7
8 //打开数据库
9 +(sqlite3 *)openSQL10 {11 if(mySQL)12 {13 returnmySQL;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 returnmySQL;37 }38
39 //关闭数据库
40 +(void)closeSQL41 {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
2
3 @interfaceModetoSQL : NSObject4
5 @property(assign,nonatomic)intsid;6 @property(strong,nonatomic)NSString *name;7 @property(assign,nonatomic)intage;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 *)stu2 {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 returnYES;27 }28 }29
30 //如果不成功 返回NO 关闭数据库
31 sqlite3_finalize(stmt);32 returnNO;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 *)findAllInfo2 {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 returninfoArr;32 }
我们在控制器 ViewController 上调用查询语句,这个语句是查询全部数据,返回一个可变数组。
//查找全部信息 创建可变数组接收
NSMutableArray *arr = [NSMutableArray new];
arr=[ModetoSQL findAllInfo];//循环遍历 取出
for (ModetoSQL *mode inarr)
{
NSLog(@"%d",mode.sid);
NSLog(@"%@",mode.name);
NSLog(@"%d",mode.age);
}
有时候我们需要根据某个条件查询数据库,such as sid;我们也可以用其他参数查询
1 //根据条件查找
2 +(ModetoSQL *)finByID:(int)sid3 {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 returnstu;26 }
上面的按照sid查找的结果, 如果有多个相同的sid,也只是返回一条数据; 只要稍作修改就可以返回全部符合条件的数据,发返回类型改为数组,把里面的if 改为while
1 //根据条件查找
2 +(NSMutableArray *)finByID:(int)sid3 {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 returnarr;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 returnYES;13 }14 }15 //关闭数据库
16 sqlite3_finalize(stmt);17 return NO;
7. — —修改数据库
最后一个根据参数修改数据库,因为我们存进去的是一个模型,所以我们修改的时候页是根据模型修改
1 //根据sid更新数据库
2 +(void)updataSQL:(ModetoSQL *)mode3 {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 "
< 关于数据库的相关操作大致就这些!>