SQL语句的简单使用
首先要先引入libsqlite3.0.tbd框架
DataBaseHandle.h
#import <Foundation/Foundation.h> @interface DataBaseHandle : NSObject // 把这个类写成单例,方便外部使用
+ (DataBaseHandle *)shareDataBaseHandle; // 打开数据库
- (void)openDB; // 关闭数据库
- (void)closeDB; // 创建表
- (void)createTable; // 插入数据
- (void)insertName:(NSString *)name
gender:(NSString *)gender
age:(NSInteger)age; // 通过uid去更新数据
- (void)updateWithUID:(NSInteger)uid; // 根据uid删除数据
- (void)deleteWithUID:(NSInteger)uid; // 查找所有数据
- (void)searchAll; // 根据姓名查找相关数据
- (void)searchWithName:(NSString *)name; @end
DataBaseHandle.m
#import "DataBaseHandle.h"
// 引入数据库操作的头文件
#import <sqlite3.h> @interface DataBaseHandle () // 数据库的存储路径
@property (nonatomic, copy) NSString *dbPath; @end static DataBaseHandle *dataBase = nil; @implementation DataBaseHandle + (DataBaseHandle *)shareDataBaseHandle { if (dataBase == nil) { @synchronized(dataBase) {
dataBase = [[DataBaseHandle alloc] init];
}
}
return dataBase;
} // 懒加载
- (NSString *)dbPath { if (!_dbPath) { // 需求:路径存储在Documents文件夹下,数据库文件为person.sqlite
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:]; _dbPath = [documentPath stringByAppendingPathComponent:@"person.sqlite"]; }
return _dbPath;
} // 好多地方都会使用到数据库,所以初始化一个数据库的静态变量
static sqlite3 *db = nil; - (void)openDB { // 接收打开的结果
// 第一个参数:filename代表数据库的存储路径
// 第二个参数:二级指针,数据库地址
int result = sqlite3_open([self.dbPath UTF8String], &db); // result是个枚举值,有很多种情况
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
} else {
NSLog(@"数据库打开失败");
} } - (void)closeDB { int result = sqlite3_close(db); if (result == SQLITE_OK) {
NSLog(@"关闭成功");
} else {
NSLog(@"关闭失败");
}
} // 创建表
- (void)createTable { // 创建一个person表,字段:uid Integer类型 主键自增 不能为空, name text类型, gender text类型, age Integer类型 NSString *createStr = @"create table if not exists person (uid integer primary key autoincrement not null, name text, gender text, age integer)"; // 第一个参数:数据库
// 第二个参数:sql语句,需要进行编码
// 第三个参数:结果回调的一个函数
// 第四个参数:回调函数的一个参数
// 第五个参数:错误信息
int result = sqlite3_exec(db, [createStr UTF8String], NULL, NULL, NULL); if (result == SQLITE_OK) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
} // 打印数据库路径,检查表是否创建成功
NSLog(@"%@", _dbPath);
} // 插入数据
- (void)insertName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age { // 当values不确定的情况下,使用?代替,稍后会进行其值的绑定过程
NSString *insertStr = @"insert into person(name, gender, age) values (?, ?, ?)"; // 预执行语句
// 第一个参数:数据库
// 第二个参数:sql语句
// 第三个参数:有正负之分,例如:如果为1,代表只往后读一个字节;如果为负值(一般写-1),遇到特殊符号才会结束读取(\000, u000)
// 第四个参数:伴随指针,会随着数据库的相关操作确定其中?的值
// 第五个参数:取值的时候如果取的不全,剩下的值都存在这里 // 伴随指针
sqlite3_stmt *stmt = nil; int result = sqlite3_prepare(db, [insertStr UTF8String], -, &stmt, NULL); // 判断执行结果
if (result == SQLITE_OK) { // 在操作成功的方法里进行?值的一些绑定设置
// 第一个参数:伴随指针
// 第二个参数:?的位置,从1开始
// 第三个参数:表示要插入的值
// 第四个参数:有正负之分,例如:如果为1,代表只往后读一个字节;如果为负值(一般写-1),遇到特殊符号才会结束读取(\000, u000)
// 第五个参数:回调函数 sqlite3_bind_text(stmt, , name.UTF8String, -, NULL);
sqlite3_bind_text(stmt, , gender.UTF8String, -, NULL);
sqlite3_bind_int64(stmt, , age); // sql语句执行完毕
// 执行伴随指针,根据伴随指针的情况判定是否插入成功(SQLITE_DONE代表伴随指针执行成功)
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
} } else { NSLog(@"result = %d", result);
} // 一定要释放伴随指针
sqlite3_finalize(stmt); } // 更新
- (void)updateWithUID:(NSInteger)uid { NSString *updateStr = @"update person set name = '高月' where uid = ?"; // 伴随指针
sqlite3_stmt *stmt = nil; int result = sqlite3_prepare(db, updateStr.UTF8String, -, &stmt, NULL); if (result == SQLITE_OK) { sqlite3_bind_int64(stmt, , uid); if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"更新数据成功");
} else {
NSLog(@"更新数据失败");
} } else {
NSLog(@"result = %d", result);
} sqlite3_finalize(stmt);
} // 根据uid删除数据
- (void)deleteWithUID:(NSInteger)uid { NSString *deleteStr = [NSString stringWithFormat:@"delete from person where uid = %ld", uid]; int result = sqlite3_exec(db, deleteStr.UTF8String, NULL, NULL, NULL); if (result == SQLITE_OK) { NSLog(@"删除成功");
} else { NSLog(@"删除失败");
}
} // 查询所有
- (void)searchAll { NSString *searchAllStr = @"select *from person"; sqlite3_stmt *stmt = nil;
// 预执行
int result = sqlite3_prepare(db, searchAllStr.UTF8String, -, &stmt, NULL); if (result == SQLITE_OK) { // 查询数据的时候,当不知道有多少次的时候使用while循环
// sqlite3_step(stmt) == SQLITE_ROW代表逐行执行数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 第一个参数:伴随指针
// 第二个参数:代表这个字段的位置【只有带?的是从1开始,其余所有的都是从0开始的】
int uid = sqlite3_column_int(stmt, );
NSLog(@"uid = %d", uid); // 在OC代码中要使用C语言的相关内容,应该使用UTF——8
NSString *name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
NSLog(@"name = %@", name); NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
NSLog(@"gender = %@", gender); int age = sqlite3_column_int(stmt, );
NSLog(@"age = %d", age);
} } else {
NSLog(@"result = %d", result);
} // 释放伴随指针
sqlite3_finalize(stmt);
} // 根据姓名查找
- (void)searchWithName:(NSString *)name { NSString *searchStr = @"select uid, gender, age from person where name = ?"; sqlite3_stmt *stmt = nil; int result = sqlite3_prepare(db, searchStr.UTF8String, -, &stmt, NULL); if (result == SQLITE_OK) {
sqlite3_bind_text(stmt, , name.UTF8String, -, NULL); while (sqlite3_step(stmt) == SQLITE_ROW) { int uid = sqlite3_column_int(stmt, );
NSString *gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, )];
int age = sqlite3_column_int(stmt, ); NSLog(@"uid = %d, gender = %@, age = %d", uid, gender, age);
} } else {
NSLog(@"result = %d", result);
} // 释放伴随指针
sqlite3_finalize(stmt);
} @end
ViewController.m
#import "ViewController.h"
#import "DataBaseHandle.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; DataBaseHandle *dataBaseHandle = [DataBaseHandle shareDataBaseHandle]; // 打开数据库
[dataBaseHandle openDB]; // 创建表
[dataBaseHandle createTable]; // 插入数据
[dataBaseHandle insertName:@"圆圆" gender:@"美女" age:]; // 更新数据
[dataBaseHandle updateWithUID:]; // 查询所有数据
[dataBaseHandle searchAll]; // 根据姓名查找
[dataBaseHandle searchWithName:@"高月"]; // 根据uid删除
// [dataBaseHandle deleteWithUID:2]; } @end
SQL语句的简单使用的更多相关文章
- SQL语句之-简单查询
SQL 语句的语法顺序是: SELECT[DISTINCT] FROM WHERE GROUP BY HAVING UNION ORDER BY 一.查询SELECT 1.查询全部列:SELEC ...
- 使用动态SQL语句实现简单的行列转置(动态产生列)
原始数据如下图所示:(商品的销售明细)date=业务日期:Item=商品名称:saleqty=销售数量: -- 建立测试数据(表)create table test (Date varchar(10) ...
- 面试题: 数据库 已看1 group by 和order by的练习 sql语句练习简单 有用
1.Sql 约束 http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html 2.修改列类型 MySQL:ALTER TABLE table ...
- SQL语句之三简单增删改查
这是前面建的库和表 USE Test go INSERT dbo.MyTable --插入数据 ( NAME ,age) VALUES ( '数据,20 -- NAME - var ...
- sql语句一些简单的用法
- 谈谈SQL 语句的优化技术
https://blogs.msdn.microsoft.com/apgcdsd/2011/01/10/sql-1/ 一.引言 一个凸现在很多开发者或数据库管理员面前的问题是数据库系统的性能问题.性能 ...
- QtSQL学习笔记(3)- 执行SQL语句
QSqlQuery类提供了一个用于执行SQL语句和浏览查询的结果集的接口. QSqlQueryModel和QSqlTableModel类提供了一个用于访问数据库的高级接口,这将在下一节介绍.如果你不熟 ...
- SqlSugar-执行Sql语句查询实例
使用SqlSugar执行sql语句 1.简单查询 SqlSugarClient db = SugarContext.GetInstance(); //执行sql语句,处理 //1.执行sql,转成li ...
- 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...
随机推荐
- nodejs+express中设置登录拦截器
在nodejs+express中,采用nodejs后端路由控制用户登录后,为了加强前端的安全性控制,阻止用户通过在浏览器地址栏中输入地址访问后台接口,在app.js中需要加入拦截器进行拦截: /*** ...
- js 各种数值类型正则匹配检测
随拿随用只js正则表达式,反正平时工作我是不写正则的,大神请自动绕行: 验证数字的正则表达式集验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数 ...
- sprint3冲刺团队贡献分-软件工程
蔡舜 : 20 卢晓洵 : 19 林宇粲 :22 王昕明 :21
- POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
- $.ajax、$.post、from表单序列化工具
$.ajax\$.post <script type="text/javascript" language="javascript" src=" ...
- KMP - HDU 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- SQL compute by 的使用
SQL compute by 的使用 摘自:http://www.cnblogs.com/Gavinzhao/archive/2010/07/12/1776107.html GROUP BY子句有个缺 ...
- Aspose.Word 操作word表格的行 插入行 添加行
rows.insert或rows.add前row必须有单元格cell private void button3_Click(object sender, EventArgs e) { ...
- 修改memcached服务的端口号
windows下修改memcached服务的端口号(默认端口:11211) 如果不是作为服务启动memcached的话,memcached -p 端口号就可以了. 通过修改注册表可以简单实现 运行:r ...
- 配置ssh免密码连接
建立ssh连接步骤: 1,在主机安装ssh-server,执行指令: apt-get install openssh-server 2,在主机上执行指令: netstat -atpn | grep 可 ...