iOS 数据库SQL的增删改查语句实现

1: 创建数据库表格

1.1 — 表格创建使用一个数据库软件快速创建:软件大小14.3M; 下载地址:http://pan.baidu.com/s/1qWOgGoc;

表格创建-> 打开软件,点击第一个 "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 }

     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 }

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

时间: 2024-10-12 15:37:26

iOS 数据库SQL的增删改查语句实现的相关文章

数据库基本查询语句(SQL常用增删改查语句 简单复习 mark)

SQL常用增删改查语句 1增 1.1[插入单行]insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1980/6/15') 1.2[将现有表数据添加到一个已有表]insert into <已有的新表> (列名) select <原表列名> from <原表名>例:insert into tongxunlu ('姓名','地址','

SQL常用增删改查语句

1增 1.1[插入单行]insert [into] <表名> (列名) values (列值)例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1980/6/15') 1.2[将现有表数据添加到一个已有表]insert into <已有的新表> (列名) select <原表列名> from <原表名>例:insert into tongxunlu ('姓名','地址','电子邮件')     

18 12 2 数据库 sql 的增删改查

---恢复内容开始--- 1  开始进入MySQL 的安装  https://www.cnblogs.com/ayyl/p/5978418.html  膜拜大神的博客 2  默认安装的时候     my.ini 文件  在  C:\ProgramData\MySQL\MySQL Server 5.7 3mysql本身安装程序不大,但数据可能会越来越大,你打开配置文件my.ini 看到datadir="c:/MySQL/data/"这行了吗, 现将data数据文件夹复制到d盘, 然后将刚

使用C#书写SQLite数据库增删改查语句(以及插入byte[]时遇到的问题总结)

在没有使用SQLite这种轻量级的数据库之前,只使用过Sqlserver2008进行数据的增删改查,公司使用的是大型的ORACLE数据库,还没有真正的会使用它.那时候觉得数据库很庞大,然而遇到SQLite以后,发现有这么个迷你的小数据库,就像女生的包包随身携带的小镜子一样,放在哪里都能使用. 废话少说,SQLite提供了如何连接.关闭等数据库操作,但真正的增.删.改.查等语句同Sqlserver.ORACLE是一样的. 首先,是创建SQLite数据库文件(写了一个方法): Public stat

SQL Server快速生成SQL增删改查语句

你还在手敲代码生成SQL语句吗?你还在为因为马虎出错的SQL语句而感到无语吗?你还在为不知怎样表达复杂的SQL语句而纠结吗?如果你的回答为"是",那你就OUT啦,快来试试应用SQL Server资源管理器快速生成SQL语句吧. 首先,打开SQL Server2008,在菜单栏"查询"下拉菜单中找到"在编辑器中设计查询",如下图: 在打开的查询设计器窗口中添加要进行操作的数据库表. 在添加的表内下方空白部分右键单击鼠标,在弹出菜单中单击"

四种简单的sql语句(增删改查语句)

四种简单的sql语句(增删改查语句) 一.插入语句 insert into [table] ([column],[column],[column]) values(?,?,?) 二.删除语句 delete from [table] where column = ? 三.修改语句 update [table] set column = ? where column = ? 四.查询语句 1)查询单条记录的所有字段 select * from [table] where [column] = ? 2

ORM 实现数据库表的增删改查

这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据库表的表名与类的类名一致 数据库字段名和类字段名一致 自增字段的访问权限为private其余字段都为public 注:如果用的是MySql数据库,有提供好的MySqlhelper非MySql数据库可以参考我写好的SqlHelper SqlHelper参考位置:http://www.cnblogs.c

Linq to SQL 简单增删改查

Linq to SQL 简单增删改查 用Linq大大减少了对数据库的一般操作所需的编码量. 运行下面事例之前,首先建一个叫做Alien的数据库表. CREATE TABLE [dbo].[Aliens](    [Id] [int] IDENTITY(1,1) NOT NULL primary key,    [Name] [nchar](10) NULL,) 建一个console项目,在项目里添加一个Linq To Sql类文件(.dbml以及两个附属文件),把Alien表从服务器资源管理器拖

Android(java)学习笔记245:ContentProvider之银行数据库创建和增删改查的实现

1.Android的四大组件: (1)Activity  用户交互的UI界面 (2)Service  后台运行的服务 (3)BroadcastReceiver 广播接收者 (4)ContentProvider  内容提供者 2. ContentProvider  内容提供者 用途:把应用程序私有的数据暴露给别的应用程序. 3.下面通过一个银行数据库创建和增删改查的实现案例说明ContentProvider的使用: (1)首先我们这里要用到数据库,首先我们必须先扩展一个抽象类SQLiteOpenH