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映 ...
随机推荐
- css3 keyframes在yuicompressor下压缩问题
@keyframes proBackAction { 0% { opacity:; } 100% { opacity: .8; } } @keyframes proBackAction { 0{ op ...
- Scene视图辅助线绘制
有时候需要在Scene视图中绘制一些辅助线,方便进行一些编辑的工作,可以通过如下类和函数完成: 绘制辅助线,相关类: Gizmos类:用于在Scene视图中绘制调试信息或辅助线,这些辅助线只有在Sce ...
- IMongoQuery的内部实现Query的用法
Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...
- 编写高质量JS代码的68个有效方法(九)
No.41.将原型视为实现细节 Tips: 对象是接口,原型是实现 避免检查你无法控制的对象的原型结构 避免检查实现在你无法控制的对象内部的属性 我们可以获取对象的属性值和调用其方法,这些操作都不是特 ...
- 编写高质量JS代码的68个有效方法(五)
No.21.使用apply方法通过不同数量的参数调用函数 Tips: 使用apply方法自定一个可计算的参数数组来调用可变参数的函数 使用apply方法的第一个参数给可变参数的方法提供一个接收者 // ...
- 存储过程分页 Ado.Net分页 EF分页 满足90%以上
存储过程分页: create proc PR_PagerDataByTop @pageIndex int, @pageSize int, @count int out as select top(@p ...
- sprint个人总结+读书博客
读书感想: 第8章讲了需求分析,在我的日常软件编写中,肯定需要需求分析的,一个没有需求的软件,编写出来也没有什么意义,只能是丢在一个角落里发霉.需求有各种各样,要怎样才能满足客户的需求呢,那就要 ...
- 数论 - 欧拉函数模板题 --- poj 2407 : Relatives
Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11372 Accepted: 5544 Descri ...
- Winform开发框架之简易工作流设计
一讲到工作流,很多人第一反应就是这个东西很深奥,有时候又觉得离我们较为遥远,确实完善的工作流设计很多方面,而正是由于需要兼顾很多方面,一般通用的工作流都难做到尽善尽美.微软也提供了几个版本的WF框架支 ...
- vmware安装mac
1.笔记本安装mac10.6 2.用VMware8,需要在mac.vmx中添加以下语句 guestOS = "darwin10"ich7m.present="TRUE&q ...