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映 ...
随机推荐
- ruby -- 进阶学习(四)paperclip上传中文命名图片
Paperclip -- 上传中文命名图片 使用Paperclip和ImageMagick插件来处理图片的时候,上传非中文命名的图片时,只要把配置写好就没问题 if you need to ...
- Container Stack
- CentOS 7.2 MySQL 5.7 主从配置
MySQL的安装:CentOS 7.2 yum方式安装MySQL 5.7 两台服务器分别如下: Master:192.168.1.100 Slave:192.168.1.101 Master配置: 编 ...
- wamp2.5虚拟站点建立
1. D:\wamp\bin\apache\Apache2.2.21\conf 目录下打开httpd.conf修改以下几个地方.(软件安装在D盘) (1)178行DocumentRoot " ...
- [Python] raw_input
该函数输入的是字符串,如果想输入数字,可以用强制转换.
- 终极事务处理(XTP,Hekaton)——万能大招?
在SQL Server 2014里,微软引入了终极事务处理(Extreme Transaction Processing),即大家熟知的Hekaton.我在网上围观了一些文档,写这篇文章,希望可以让大 ...
- Eclipse魔法堂:修改主题
一.前言 习惯黑色主题,而Eclipse默认的白底主题显然不是我的菜,下面一起来修改主题吧! 二.主题资源 Eclipse Color Themes(http://eclipsecolorthemes ...
- Scrum团队成立3.0
博客园 首页 新随笔 联系 订阅 管理 随笔 - 23 文章 - 0 评论 - 26 0428-Scrum团队成立3.0 ------------------------------3.0---- ...
- SQL年月日方面的查询信息
这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DAT ...
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...