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,类型均为字符型 实际应用 ...
随机推荐
- AvalonEdit验证语法并提示错误
<UserControl x:Class="WpfTestApp.Xml.XmlEditor" xmlns="http://schemas.microsoft.co ...
- vs2012 与 win7 不兼容的问题
Visual Studio 2012 与此版本的 Windows 不兼容 突然出现的,如下图: 这个是网上找的图,我的没来得及截图就修复了,基本一致,只是我的是win7 64位系统,所以安装位置那里是 ...
- Educational Codeforces Round 61 (Rated for Div. 2) E. Knapsack
非常经典的dp题,因为1至8的最大公约数是840,任何一个数的和中840的倍数都是可以放在一起算的, 所以我只需要统计840*8的值(每个数字(1-8)的sum%840的总和),剩下都是840的倍数 ...
- Python获取每一位的数字,并返回到列表
通过计算 def calc(value): result = [] while value: result.append(value % 10) value = value // 10 #逆序,按正常 ...
- 服务治理-> Spring Cloud Eureka
服务治理->搭建服务注册中心 服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务 实例的自动化注册与发现. 为什么我们在微服务架构中那么需要服务治理模块呢?微服务 系统 ...
- 微信小程序-帝国cms会员系统调用
在用户->管理会员字段,增加如下字段:openidsession_keylsktokennicknameheadimg设置用户名长度然后,在系统,系统变最设置,用户设置,将注册用户名设置长度改成 ...
- 搭建好看的静态博客(使用Hexo进行搭建)
经常看到大牛的博客非常的高大帅气,虽然我很渣,但是逼格不能输,所以有了以下的搭建记录. 我的成果ninwoo,喜欢的可以参考下面的记录一起来动手搞起来. 安装Git Bash 访问git下载最新版本的 ...
- 欧拉筛——$O(n)$复杂度的质数筛法
欧拉筛法可以以\(O(n)\)的时间,空间复杂度求出\(1-n\)范围内的所有质数. 其核心思想是每个合数仅会被其最小的质因数筛去一次. See this website for more detai ...
- Python交互数据库(Mysql | Mongodb | Redis)
数据库 Mysql Mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品 MyS ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...