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完整增删改查操作的更多相关文章

  1. 【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作

    用pip下载pymysql并引用 具体请参考文章: <Python之MySQL数据库增删改查操作> <python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删 ...

  2. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

  3. 利用SQLiteOpenHelper创建数据库,进行增删改查操作

    Android中提供SQLiteOpenHelper类,在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承和扩展SQLiteOpenHelper类主要做的工作就是重写 ...

  4. java连接mysql数据库 三 实现增删改查操作

    同以前一样,先写一个数据库打开和关闭操作类 public class DBConnection { String driver = "com.mysql.jdbc.Driver"; ...

  5. (转)SQLite数据库增删改查操作

    原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...

  6. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  7. PHP程序中使用PDO对象实现对数据库的增删改查操作的示例代码

    PHP程序中使用PDO对象实现对数据库的增删改查操作(PHP+smarty) dbconn.php <?php //------------------------使用PDO方式连接数据库文件- ...

  8. MySQL数据库的权限问题操作及基本增删改查操作

    前面我们讲了mysql的基本内容,现在我们详细的了解一下mysql中的具体操作. what's the SQl SQL(Structured Query Language 即结构化查询语言) SQL语 ...

  9. python web.py操作mysql数据库,实现对数据库的增删改查操作

    使用web.py框架,实现对mysql数据库的增删改查操作: 该示例代码中连接的是本地数据库testdb,user表,表结构比较简单,只有两个字段:mobile和passwd,类型均为字符型 实际应用 ...

随机推荐

  1. Package设计2:增量更新

    SSIS 设计系列: Package设计1:选择数据类型.暂存数据和并发 Package设计2:增量更新 Package 设计3:数据源的提取和使用暂存 一般来说,ETL实现增量更新的方式有两种,第一 ...

  2. CSS快速入门-实用技巧

    1.整体布局 大部分的布局都是由三部分组成,header.body.footer. 代码布局:写三个div <!DOCTYPE html> <html lang="en&q ...

  3. vs2019编译redis

    版本信息 使用Redis源码版本,解压工程右键生成hiredis项目正常,编译Win32_Interop项目报下图错误(error C2039:system_error:不是std成员;error C ...

  4. weblogic在linux和window下的安装

    weblogic在linux和window下的安装 weblogic下载地址 Windows server2008 一直下一步没什么坑 centos6.5 使用rpm安装jdk8 JDK下载 安装jd ...

  5. 初学者浅度剖析eShopOnContainers 里面用到的MediatR .

    一.介绍 简单了解下开源项目 MedatR, eShopOnContainers, MediatR作者Jimmy Bogard : Simple mediator implementation in ...

  6. 为什么你写的用例测不出Bug来?

    我们写测试用例的目的是为了能够整理思路,把要测试的地方列出来,做为知识的积淀,用例可以交给其他测试人员执行,或者是跟需求提出者进行讨论,对用例进行补充和修改.那么为啥你写的用例测不出Bug来呢,真的是 ...

  7. Android Studio|IntelliJ IDEA 上传代码到码云

    码云 新建项目 Android Studio|IntelliJ IDEA 然后仓库就创建好了 此时左方文件应显示为红色 添加代码到git仓库 提交代码到git仓库 push等待被拒绝 拉取README ...

  8. 快速获取APP对应的appPackage和appActivity

    appPackage和appActivity 进行appium自动化测试非常重要的两个参数,我们所测试的APP不同,这两个参数肯定也是不一样的. 介绍两种方法可快速获取APP的这两个参数: 方法一 1 ...

  9. 剑指offer试题(PHP篇三)

    21.栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4 ...

  10. 腾讯云linux+kodexplorer可道云搭建私有云盘

    kodexplorer可道云介绍KodExplorer可道云,原名芒果云,是基于Web技术的私有云和在线文件管理系统.致力于为用户提供安全可控.可靠易用.高扩展性的私有云解决方案.用户只需通过简单环境 ...