一、简单说明
在iOS中使用sqlite3,首先要添加库文件libsqlite3.dylib和导入主头文件。
二、具体说明
新建一个项目,在项目的主界面中放四个按钮(分别是,增加、删除、修改、查询)。
1.sqlite3_open(<#const char *filename#>,<#sqlite3 **ppDb#>)函数的一些说明:
(1)作用:把一个文件名称传递给他,它会自动检测这个文件是否存在,如果不存在的话,会自动创建相应的文件(这里为数据库文件,刚创建为空)。
(2)参数:它的第一个参数为文件的名称(需转换为C语言的),第二个参数是数据库的实例,sqlite3 *db;
说明:sqlite3是一种类型,db是数据库的句柄,就是数据库的象征,如果要进行增删改查,就得操作db这个实例。
(3)返回值:它的返回值为int型的,根据函数的返回值可以知道,打开数据库文件是成功还是失败,如果返回值是sqlITE_OK则说明成功,否则为失败。
2.打开数据库
双击打开,查看发现打开的数据库连接名称为students,默认为文件名的前缀,数据库创建成功。
3.创建表
函数说明:
参数:第一个参数为数据库的句柄(db),第二个参数为sql语句,第三个参数为回调参数,是一个指向函数的指针,如果把callback前面的*改成^则就是一个block代码段,第四个参数可以写NULL,第五个参数为错误信息,用以代码调试。
1 //1.打开数据库文件(如果数据库文件不存在,那么该函数会自动创建数据库文件)
2 int result = sqlite3_open(cfileName,&db); 3 if (result==sqlITE_OK) { 打开成功
4 NSLog(@"成功打开数据库"); 5
6 2.创建表
7 const char *sql="CREATE TABLE IF NOT EXISTS t_students (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);"; 8 char *errmsg=NULL; 9 result = sqlite3_exec(db,sql,NULL,&errmsg); 10 if (result==sqlITE_OK) { 11 NSLog(创表成功12 }else
13 { 14 NSLog(创表失败----%s",errmsg); 15 } 16 }17 { 18 NSLog(打开数据库失败19 }
执行后,创表成功,打开创建的表查看:
调试技巧:
__LINE__宏打印行号。
4.插入数据
实现代码:
查看数据库里t_students表中的数据:
5.选择(select)查询操作
select操作也可以使用sqlite3_exec函数实现,但通常使用下面的函数。
参数:第一个参数为数据库的句柄,第二个参数为sql语句,第三个参数为sql的长度(如果设置为-1,则代表系统会自动计算sql语句的长度),第四个参数用来取数据,第五个参数为尾部一般用不上可直接写NULL。
示例代码:
三、补充
完整代码:
YYViewController.m文件
一、示例
1.新建一个继承自NSObject的模型
该类中的代码:
YYPerson.h 03-模糊查询 5 Created by apple on 14-7-27. Copyright (c) 2014年 wendingding. All rights reserved. #import <Foundation/Foundation.h> 10 11 @interface YYPerson : NSObject 12 @property (nonatomic,assign) int ID; 13 @property (nonatomic,copy) NSString *name; 14 @property (nonatomic,255); line-height:1.5!important">int age; 15 16 @end
2.新建一个工具类,用来管理模型
工具类中的代码设计如下:
YYPersonTool.h文件
在代码中,让主控制器直接继承自UITableViewController
代码设计如下:
YYViewController.m文件
二、简单说明
一、简单说明
1.打开数据库
int sqlite3_open(
const char *filename,// 数据库的文件路径
);
2.执行任何sql语句
int sqlite3_exec(
int (*callback)(void*,int,char**,char**),// sql语句执行完毕后的回调
void *,// 回调函数的第1个参数
char **errmsg // 错误信息
int sqlite3_prepare_v2(
const char *zsql,// 需要检查的sql语句
int nByte,// sql语句的最大字节长度
sqlite3_stmt **ppStmt,// sqlite3_stmt实例,用来获得数据库数据
const char **pzTail
4.查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回sqlITE_ROW
5.利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*,int iCol); // 浮点数据
int sqlite3_column_int(sqlite3_stmt*,int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*,int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*,int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*,int iCol); // 字符串数据
二、sqlite编码
创建或打开数据库
sqlite3*db = NULL;
int result =sqlite3_open([path UTF8String],&db);
代码解析:
sqlite3_open()将根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量sqlITE_OK,则表示成功打开数据库
2.执行不返回数据的sql语句
执行创表语句
char *errorMsg = NULL; // 用来存储错误信息
char *sql = "create table if not exists t_person(id integer primary key autoincrement,name text,age integer);";
int result =sqlite3_exec(db,&errorMsg);
sqlite3_exec()可以执行任何sql语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
sqlite3_exec()还可以执行的语句:
(1)开启事务:begin transaction;
(2)回滚事务:rollback;
(3)提交事务:commit;
3.带占位符插入数据
char *sql = "insert into t_person(name,age) values(?,?);";
sqlite3_stmt*stmt;
if (sqlite3_prepare_v2(db,-1,NULL) ==sqlITE_OK) {
sqlite3_bind_text(stmt,1,"母鸡",NULL);
sqlite3_bind_int(stmt,2,27);
}
if (sqlite3_step(stmt) !=sqlITE_DONE) {
NSLog(@"插入数据错误");
sqlite3_finalize(stmt);
sqlite3_prepare_v2()返回值等于sqlITE_OK,说明sql语句已经准备成功,没有语法问题
sqlite3_bind_text():大部分绑定函数都只有3个参数
(1)第1个参数是sqlite3_stmt *类型
(2)第2个参数指占位符的位置,第一个占位符的位置是1,不是0
(3)第3个参数指占位符要绑定的值
(4)第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
(5)第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite_step():执行sql语句,返回sqlITE_DONE代表成功执行完毕
sqlite_finalize():销毁sqlite3_stmt *对象
4.查询数据
char *sql = "select id,age from t_person;";
while (sqlite3_step(stmt) ==sqlITE_ROW) {
int _id =sqlite3_column_int(stmt,0);
char *_name = (char *)sqlite3_column_text(stmt,1);
NSString *name = [NSStringstringWithUTF8String:_name];
int _age =sqlite3_column_int(stmt,2);
NSLog(@"id=%i,name=%@,age=%i",_id,_age);
}
sqlite3_finalize(stmt);
iOS开发数据库篇—FMDB简单介绍
一、简单说明
1.什么是FMDB
FMDB以OC的方式封装了sqlite的C语言API
2.FMDB的优点
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
3.FMDB的github地址
https://github.com/ccgus/fmdb
二、核心类
FMDB有三个主要的类
(1)FMDatabase
一个FMDatabase对象就代表一个单独的sqlite数据库
用来执行sql语句
(2)FMResultSet
使用FMDatabase执行查询后的结果集
(3)FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
三、打开数据库
通过指定sqlite数据库文件路径来创建FMDatabase对象
FMDatabase *db = [FMDatabase databaseWithPath:path];
if (![db open]) {
NSLog(@"数据库打开失败!");
}
文件路径有三种情况
(1)具体文件路径
如果不存在会自动创建
(2)空字符串@""
会在临时目录创建一个空的数据库
(3)nil
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
四、执行更新
在FMDB中,除查询以外的所有操作,都称为“更新”
create、drop、insert、update、delete等
使用executeUpdate:方法执行更新
- (BOOL)executeUpdate:(NSString*)sql,...
- (BOOL)executeUpdateWithFormat:(NSString*)format,255)">- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
示例
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;",@20,@"Jack"]
五、执行查询
- (FMResultSet *)executeQuery:(NSString*)sql,255)">- (FMResultSet *)executeQueryWithFormat:(NSString*)format,255)">- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍历结果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
六、代码示例
1.新建一个项目,导入libsqlite3库,并在项目中包含主头文件
2.下载第三方框架FMDB
3.示例代码
YYViewController.m文件
04-FMDB基本使用 FMDB.h11 13 @property(nonatomic,strong)FMDatabase *db; 18 - (19 { 20 [super viewDidLoad]; 21 1.获得数据库文件的路径 22 NSString *doc=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,128); line-height:1.5!important">23 NSString *fileName=[doc stringByAppendingPathComponent:student.sqlite24 25 2.获得数据库 26 FMDatabase *db=[FMDatabase databaseWithPath:fileName]; 27 28 3.打开数据库 29 if ([db open]) { 30 4.创表 31 BOOL result=[db executeUpdate:CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT,128); line-height:1.5!important">32 if (result) { 33 NSLog(34 }35 { 36 NSLog(创表失败37 } 38 } 39 self.db=db; 40 41 } 42 43 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 44 { 45 [self delete]; 46 [self insert]; 47 [self query]; 49 50 插入数据 51 -(void)insert 52 { 53 10; i++) { 54 NSString *name = [NSString stringWithFormat:jack-%d55 executeUpdate : 不确定的参数用?来占位 56 [self.db executeUpdate:INSERT INTO t_student (name,age) VALUES (?,?);40))]; 57 [self.db executeUpdate:@"INSERT INTO t_student (name,?);" withArgumentsInArray:@[name,@(arc4random_uniform(40))]]; 58 59 executeUpdateWithFormat : 不确定的参数用%@、%d等来占位 60 [self.db executeUpdateWithFormat:@"INSERT INTO t_student (name,age) VALUES (%@,%d);",arc4random_uniform(40)]; 61 } 62 } 63 64 删除数据 65 -(void)delete 66 { 67 [self.db executeUpdate:@"DELETE FROM t_student;"]; 68 [self.db executeUpdate:DROP TABLE IF EXISTS t_student;69 [self.db executeUpdate:70 } 71 72 查询 73 - (void)query 74 { 75 1.执行查询语句 76 FMResultSet *resultSet = [self.db executeQuery:SELECT * FROM t_student77 78 2.遍历结果 79 while ([resultSet next]) { 80 int ID = [resultSet intForColumn:id81 NSString *name = [resultSet stringForColumn:name82 int age = [resultSet intForColumn:age83 NSLog(%d %@ %d84 } 85 } 86 87 @end
打印查看结果:
提示:
如果ID设置为逐渐,且设置为自动增长的话,那么把表中的数据删除后,重新插入新的数据,ID的编号不是从0开始,而是接着之前的ID进行编号。
注意:
不要写成下面的形式,不要加'',直接使用%@,它会自动认为这是一个字符串。