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映 ...
随机推荐
- webgame设计之功能模块的代理模式
原文地址:http://chengduyi.com/blog/?post=27 在游戏设计中,通常会将一些实现了具体功能的模块进行封装,达到重用的目的.这些功能模块包括:1.网络通信模块(实现连接,断 ...
- 剑指架构师系列-Hibernate需要掌握的Annotation
1.一对多的关系配置 @Entity @Table(name = "t_order") public class Order { @Id @GeneratedValue priva ...
- webapp项目前端总结
提纲 整体把握,从设计稿入手——技术选型 并行开发,从实现静态页面开始 前端自动化 前端js逻辑 前后端集成 小问题集合 总结 1.整体把握,从设计稿入手 —— 技术选型 新项目到手,算是运气好,设计 ...
- Dewey – 标记和搜索 Chrome 浏览器书签
Dewey 是一个 Chrome 应用程序,用于标记,搜索和排序你的 Chrome 浏览器书签.借助 Dewey,您可以添加自定义标签,生成你的书签截图,灵活快捷的方式进行搜索和排序. 您可能感兴趣的 ...
- [linux]重拾linux
起因 因为想重拾起linux,同时需要用docker起几个镜像,用来学习网络知识.本来想直接去阿里云上买,后来一想自己机器上,起一个linux是个不错的选择,毕竟不花钱! 还可以用来做本地测试,学习使 ...
- Linux内核知识
版本 linus树 Linux内核最初创始人--Linus Torvalds管理一个Linus树,linus树也称为主线(mainline).一般指的upstream,"上游",也 ...
- spring日记------部署环境、写demo
一.安装jdk1.7 祥见http://zhinan.sogou.com/guide/detail/?id=1610006590 二.创建web项目 略 三.配置ssm环境 3.1添加spring.m ...
- Linq之Lambda表达式
一 什么是LINQ? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...
- DistributedCache小记
一.DistributedCache简介 DistributedCache是hadoop框架提供的一种机制,可以将job指定的文件,在job执行前,先行分发到task执行的机器上,并有相关机制对cac ...
- 平衡二叉树---Shaolin
Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temp ...