iOS 数据库sqlite完整增删改查操作
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 文件
#import <Foundation/Foundation.h>
#import <sqlite3.h> @interface SQLDatas : NSObject //打开数据库
+(sqlite3 *)openSQL; //关闭数据库
+(void)closeSQL; @end
SQLDatas.m 实现文件
#import "SQLDatas.h" //定义一个全局数据库
static sqlite3 *mySQL =nil; @implementation SQLDatas //打开数据库
+(sqlite3 *)openSQL
{
if (mySQL)
{
return mySQL;
}
/**
//将bundle上的数据库转移到沙盒
*/
//获取bundle路径 数据库文件名 数据库名和创建的表名一样
NSString *bundlepath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"sqlite"];
//获取沙盒路径
NSString *docupath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[];
//拼接文件完整路径
NSString *filePath =[docupath stringByAppendingPathComponent:@"Student.sqlite"]; //管理沙盒的对象
NSFileManager *fm =[NSFileManager defaultManager]; //判断是否已经存在这个文件,如果不存在就拷贝到沙盒
if ([fm fileExistsAtPath:filePath] == NO)
{
[fm copyItemAtPath:bundlepath toPath:filePath error:nil];
}
//打开数据库
sqlite3_open([filePath UTF8String], &mySQL); return mySQL;
} //关闭数据库
+(void)closeSQL
{
if (mySQL)
{
//置空
mySQL=nil;
sqlite3_close(mySQL);
}
} @end
3. ——创建数据模型
3.1 — 新建一个数据模型 ModetoSQL,我们将数据赋值给模型,再把模型添加进数据库
ModetoSQL.h 头文件
#import <Foundation/Foundation.h> @interface ModetoSQL : NSObject @property(assign,nonatomic)int sid;
@property(strong,nonatomic)NSString *name;
@property(assign,nonatomic)int age;
@property(assign,nonatomic)NSData *image; //添加信息到数据库
+(BOOL)addInfoToSQL:(ModetoSQL *)stu; //查询数据
+(NSMutableArray *)findAllInfo; //根据条件查找
+(ModetoSQL *)finByID:(int)ID; //删除数据
+(BOOL)deleByID:(int)sid; //根据id更新数据库
+(void)updataSQL:(ModetoSQL*)mode; @end
4. — 添加数据库
ModetoSQL.m 文件
+(BOOL)addInfoToSQL:(ModetoSQL *)stu
{
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL]; //2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil; //3. 通过数据库语句进行数据库连接操作 表名括号里的参数要喝表格里的一样 如果result 为1,一般都是此语句错误;
int result= sqlite3_prepare_v2(mmSQL, "insert into Student(sid,name,age,image) values(?,?,?,?)", -, &stmt, nil);
//如果返回为0,则成功,判断准备语句是否有问题
if (result == SQLITE_OK)
{
//把四个值准备插入 1 2 3 4对应上面的问号
sqlite3_bind_int(stmt, , stu.sid);
sqlite3_bind_text(stmt, , [stu.name UTF8String], -, NULL);
sqlite3_bind_int(stmt, , stu.age);
//把OC的数据流 转成C语言的二进制流 [stu.imageD bytes]
sqlite3_bind_blob(stmt, , [stu.image bytes], (int)[stu.image length],nil); //判断操作是否成功
if (SQLITE_DONE == sqlite3_step(stmt))
{
//关闭数据库
[SQLDatas closeSQL];
return YES;
}
} //如果不成功 返回NO 关闭数据库
sqlite3_finalize(stmt);
return NO;
}
添加语句有了以后,我们就在控制器 ViewController 上调用添加一个数据进去。
//创建一个模型对象,并赋值
ModetoSQL *mode =[ModetoSQL new];
mode.sid = ;
mode.name =@"张三";
mode.age = ;
//把图片转成数据流 添加一张本地图片01.png,png后缀可以去掉,图片的数据流一般都是网络请求的;
UIImage *img = [UIImage imageNamed:@""];
//将图片转换成数据流 压缩0.5
NSData *imgData = UIImageJPEGRepresentation(img, 0.5);
mode.image =imgData; //添加到数据库
BOOL isSuc = [ModetoSQL addInfoToSQL:mode];
NSLog(@"%d",isSuc); //打印判断是否成功 //打印沙盒文件路径 如果不确定数据是否真的添加 可以进入沙盒文件下的Documents查看
NSLog(@"%@",NSHomeDirectory());
如果之前的语句没有写错,那么就会成功添加一个数据模型到数据库。
通过打印的沙盒路径找到数据库,打开数据库可以看到添加成功的数据。

我们不可能每次都打开沙盒查看数据库,所以得用数据库查询语句;
5. — —查询数据库
ModetoSQL.m
+(NSMutableArray *)findAllInfo
{
//创建接收信息的数组
NSMutableArray *infoArr = [NSMutableArray new];
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL]; //2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil; //3. 通过数据库语句进行数据库连接操作
int result =sqlite3_prepare_v2(mmSQL, "select *from Student", -, &stmt, nil);
if (result == SQLITE_OK)
{
while (SQLITE_ROW == sqlite3_step(stmt))
{
//执行查询操作
ModetoSQL *stu =[ModetoSQL new];
stu.sid =sqlite3_column_int(stmt, );//0个位置
//C语言字符串 转OC字符串
stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
stu.age =sqlite3_column_int(stmt, );
//将二进制数据流 转OC数据量
stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, ) length:sqlite3_column_bytes(stmt, )];
//添加进数组
[infoArr addObject:stu];
}
}
//关闭数据库
[SQLDatas closeSQL];
return infoArr;
}
我们在控制器 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;我们也可以用其他参数查询
//根据条件查找
+(ModetoSQL *)finByID:(int)sid
{
ModetoSQL *stu =[ModetoSQL new];
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL];
//2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil;
//3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
int result = sqlite3_prepare_v2(mmSQL, "select * from Student where sid = ?", -, &stmt, nil);
if (result == SQLITE_OK)
{
sqlite3_bind_int(stmt, , sid); //id在第一个位置
if (SQLITE_ROW == sqlite3_step(stmt))
{
stu.sid =sqlite3_column_int(stmt, );
stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
stu.age =sqlite3_column_int(stmt, );
//将二进制数据流 转OC数据量
stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, ) length:sqlite3_column_bytes(stmt, )];
}
}
//关闭数据酷
sqlite3_finalize(stmt);
return stu;
}
上面的按照sid查找的结果, 如果有多个相同的sid,也只是返回一条数据; 只要稍作修改就可以返回全部符合条件的数据,发返回类型改为数组,把里面的if 改为while
//根据条件查找
+(NSMutableArray *)finByID:(int)sid
{
NSMutableArray *arr =[NSMutableArray new]; //ModetoSQL *stu =[ModetoSQL new];
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL];
//2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil;
//3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
int result = sqlite3_prepare_v2(mmSQL, "select * from Student where sid = ?", -, &stmt, nil);
if (result == SQLITE_OK)
{
sqlite3_bind_int(stmt, , sid); //id在第一个位置 while (SQLITE_ROW == sqlite3_step(stmt))
{ ModetoSQL *stu = [ModetoSQL new];
stu.sid =sqlite3_column_int(stmt, );
stu.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
stu.age =sqlite3_column_int(stmt, );
//将二进制数据流 转OC数据量
stu.image = [NSData dataWithBytes:sqlite3_column_blob(stmt, ) length:sqlite3_column_bytes(stmt, )];
[arr addObject:stu];
}
}
//关闭数据酷
sqlite3_finalize(stmt);
return arr;
}
6. — —删除数据库
接下来就是删除数据了,根据 sid删除;
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL];
//2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil;
//3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
int result =sqlite3_prepare_v2(mmSQL, "delete from Student where sid= ?", -, &stmt, nil);
if (result== SQLITE_OK)
{
sqlite3_bind_int(stmt, , sid);
if (SQLITE_DONE== sqlite3_step(stmt))
{
return YES;
}
}
//关闭数据库
sqlite3_finalize(stmt);
return NO;
7. — —修改数据库
最后一个根据参数修改数据库,因为我们存进去的是一个模型,所以我们修改的时候页是根据模型修改
//根据sid更新数据库
+(void)updataSQL:(ModetoSQL *)mode
{
//1. 打开数据库,返回一个数据库
sqlite3 *mmSQL =[SQLDatas openSQL];
//2. 创建一个SQL描述对象
sqlite3_stmt *stmt = nil;
//3. 通过数据库语句进行数据库连接操作 删除语句里的对象要像对应sID
int result =sqlite3_prepare_v2(mmSQL, "update Student set name = ? ,age = ? ,image = ? where sid = ?", -, &stmt, nil); if (result ==SQLITE_OK)
{
//数字必须和问号顺序相对应;
sqlite3_bind_int(stmt, , mode.sid);
sqlite3_bind_text(stmt, , [mode.name UTF8String], -, nil);
sqlite3_bind_int(stmt, , mode.age);
sqlite3_bind_blob(stmt, , [mode.image bytes], (int)[mode.image length], nil);
if (sqlite3_step(stmt) == SQLITE_DONE)
{ }
}
sqlite3_finalize(stmt); //关闭数据库
}
根据两个参数修改其中的值" update gooodsInfo set number = 11 where goodsid = 19 and price = 66 "
< 关于数据库的相关操作大致就这些!>
iOS 数据库sqlite完整增删改查操作的更多相关文章
- 【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作
用pip下载pymysql并引用 具体请参考文章: <Python之MySQL数据库增删改查操作> <python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删 ...
- 48.Python中ORM模型实现mysql数据库基本的增删改查操作
首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...
- 利用SQLiteOpenHelper创建数据库,进行增删改查操作
Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写 ...
- java连接mysql数据库 三 实现增删改查操作
同以前一样,先写一个数据库打开和关闭操作类 public class DBConnection { String driver = "com.mysql.jdbc.Driver"; ...
- (转)SQLite数据库增删改查操作
原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码
PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...
- MySQL数据库的权限问题操作及基本增删改查操作
前面我们讲了mysql的基本内容,现在我们详细的了解一下mysql中的具体操作. what's the SQl SQL(Structured Query Language 即结构化查询语言) SQL语 ...
- python web.py操作mysql数据库,实现对数据库的增删改查操作
使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...
随机推荐
- 菜鸟vimer成长记——第1章、统一概念
不管学什么技术,我都深信概念是最重要的.是影响整个学习轨迹,决定能在这个技术领域高度. 当然如果你现在的目的不是在学习而在于解决问题(很多人不愿意承认,或者没发现),那概念就暂时没那么重要了. 目的 ...
- 宏基4752g 开机进度条卡到75%左右,解决办法
起因:更新win10推送的更新补丁,失败自动回退.开机进度条只能走到75%,bios进不去,最后就卡在开机的logo.(还有其他人是win7直接升级win10,也出现了这种情况.)解决办法:重刷bio ...
- selenium 定位不到元素总结
元素在网页上,却会出现定位不到的情况的分析. 1. 定位不正确. 2. 页面还没有加载完就去查找元素了. 3. 有遮罩层. 首先说下第3点. 先前在公司遇到过这样的问题. 页面是显示出来了, 这个元素 ...
- NO---20 文件上传
文件上传是我们会经常用到的一个业务,其实在h5中新增了FormData的对象,用它来提交表单,并且可以提交二进制文件,所以今天就写写文件上传,希望可以对大家有帮助 FormData 上传文件实例 首先 ...
- 欧拉筛——$O(n)$复杂度的质数筛法
欧拉筛法可以以\(O(n)\)的时间,空间复杂度求出\(1-n\)范围内的所有质数. 其核心思想是每个合数仅会被其最小的质因数筛去一次. See this website for more detai ...
- hadoop 集群HA高可用搭建以及问题解决方案
hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...
- 小米6x抓包小程序https请求
1. charles安装证书,手机设置代理等这里不多讲了, 请进入下面链接查看详细 https://blog.csdn.net/manypeng/article/details/79475870 2. ...
- Python中collections模块的使用
本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...
- jenkins配置01--用户添加及权限配置
原文出自:https://www.cnblogs.com/kevingrace/p/6019707.html 下面重点记录下jenkins安装后的一些配置: (1)添加用户权限 jenkins初次登陆 ...
- mysql 修改语句及耗时
1.含有某串字母的字段替换: update imagetable set imageID = replace(imageID, 'ZH0211001', 'ZH4111001') 只要imageID含 ...