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,类型均为字符型 实际应用 ...
随机推荐
- 【译】2017年要学习的三个CSS新特性
这是翻译的一篇文章,原文是:3 New CSS Features to Learn in 2017,翻译的不是很好,如有疑问欢迎指出. 新的一年,我们有一系列新的东西要学习.尽管CSS有很多新的特性, ...
- 图片转换成word 公式
1 下载安装mathpix, 利用该软件将图片转换成LaTeX公式 2 参考此帖,将LaTeX公式转换成word公式 https://www.douban.com/note/648629593/ ht ...
- HT7A6312—— 离线开关电源小功率初级转换开关IC 记录总结
1. 芯片特性 a. 固定60KHz开关频率: b. 宽Vcc输出电压范围:9V - 38V: c. 宽交流输入电压范围:85Vac - 265Vac: d. 电流模式PWM控制: e. 带迟滞的辅助 ...
- Python+Selenium UI自动化测试环境搭建及使用
一什么是Selenium ? Selenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源.免费:多平台.浏览器.多语言支持:对web页面有良好的支持:AP ...
- Android studio Error occurred during initialization of VM 问题解决
最近开发导入其他Android项目遇见的问题,如下图: 解决办法: 将org.gradle.jvmargs=的值该为521(堆内存分配过高导致) 备忘,希望能帮助到大家
- ESP8266/ESP32模块晶振频偏调试
ESP8266/ESP32模块晶振频偏调试 !> 前提:晶振频偏调试是需要仪器设备的支持才能完成的. 测试环境:IQ2010综合测试仪 本文仅记录有关频偏调试的主要内容,其余不在赘述. IQ20 ...
- TPO-22 C1 Complain about a biased article
/* 加粗:语音部分 * 红色:单词部分 * 斜体:语法部分 * 下划线:信号词/句 */ 第 1 段 1.Listen to a conversation between a student and ...
- OpenSSH技术详解
一.什么是Openssh OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现.SSH协议族可以用来进行远程控制, 或在计算机之间传送文件.而实现此功能的传统方式,如teln ...
- 【Docker】第五篇 Docker 数据管理
一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...
- 机器学习算法 --- Naive Bayes classifier
一.引言 在开始算法介绍之前,让我们先来思考一个问题,假设今天你准备出去登山,但起床后发现今天早晨的天气是多云,那么你今天是否应该选择出去呢? 你有最近这一个月的天气情况数据如下,请做出判断. 这个月 ...