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映 ...
随机推荐
- CommonJS 的 AMD 规范
异步模块定义(Asynchronous Module Definition,简称 AMD)API 描述了一种定义模块的机制,模块及其依赖模块可以通过这种机制进行加载.该机制特别适用于浏览器. 本规范曾 ...
- ListView不规律刷新多次,重复执行getView
写ListView的时候,有时会发现ListView中的getView执行多次,有的时候又不是,搞了半天才找到原因,在http://blog.csdn.net/danielinbiti/article ...
- 8月11日嵌入式Linux开发免费项目体验邀您参与
嵌入式Linux开发免费项目体验开课啦~~我们特意邀请到粤嵌金牌讲师和技术专家,为大家带来精彩有趣的嵌入式公开课,涉及到嵌入式学习.研发的方方面面.课堂中我们能体验到的不仅仅是最新资讯.技术体验,还有 ...
- [Math] A love of late toward Mathematics - how to learn it?
Link: https://www.zhihu.com/question/19556658/answer/26950430 王小龙 ,数学,计算机视觉,图形图像处理 数学系博士怒答! 我想大家 ...
- 【Java多线程】JUC包下的工具类CountDownLatch、CyclicBarrier和Semaphore
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行 ...
- 五分钟,运用cocoaui库,搭建主流iOS app中我的界面
本项目基于天天团购项目,在上一篇中有说到! 首先介绍一些cocoaui,是国内的一名程序员做的开源的开源系统,目的是为了简化ios布局!官网地址:www.cocoaui.com,github地址:ht ...
- R提高篇(二): 图形初阶
目录: 图形示例 图形参数 符号.线条 颜色 文本属性 尺寸与边界 自定义标题 自定义坐标轴 图例 文本标注 图形组合 图形示例 如下代码描述病人对两种药物五个剂量水平上的响应情况 > myda ...
- Sprint Three 回顾与总结&发表评论&团队贡献分
● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 从sprint one到three,我们团队配合十分默契,互相帮助,虽然遇到了不少 ...
- 阅读《构建之法》P384~391
通过阅读<构建之法>P384~391以及参考阅读杜老师给出的链接,得出一个重要的结论:软件工程师的职业道德至关重要. 软件工程的动态性和需求的前后关系,要求一个规范能对出现的新情形有较强的 ...
- ChartDirector应用笔记(二)
关于Simple Bar Chart Simple bar chart是XYChart大类中的Bar chart类型中的最简单的例子.Bar chart的表现形式简单直观,在数据量较少.数据维度简单等 ...