SQLite3是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小
SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中
在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 和 导入主头文件#import
//数据库在沙盒中的存放路径
NSString *filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPahtComponent:@"shops.db"];
//参数一:数据库文件存放路径,如果数据库文件不存在,系统会自动创建文件并且自动初始化数据库
//参数二:数据库实例对象
//SQLITE_OK:是sqlite3的一个常量,代表操作执行成功
//sqlite3_open():根据文件路径打开数据库
if(sqlite3_open(filename.UTF8String, &_db) == SQLITE_OK){
const char *sql = "create table if not exists t_shop (id integer primary key, name text not null, price real);";
char *errmsg = NULL;//用来存储错误信息
//参数一:数据库实例对象
//参数二:执行的SQL语句
//sqlite3_exec()可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据
if(sqlite3_exec(self.db, sql, NULL, NULL, &errmsg) != SQLITE_OK){
NSLog(@"创表失败--%s",errmsg);
}
} else {
NSLog(@"打开数据库失败");
}
在上面的代码中,我们做了两个操作,首先打开数据库我们使用了sqlite3_open这个方法,该方法根据文件路径打开数据库,如果不存在,则会创建一个新的数据库。如果result等于常量SQLITE_OK,则表示成功打开数据库。该方法有两个参数,如下:
int sqlite3_open(
const char *filename, // 数据库的文件路径
sqlite3 **ppDb // 数据库实例
);
其次,我们使用sqlite3_exec方法来执行建表操作。该方法适合于查询结果集之外的任何操作。
int sqlite3_exec(
sqlite3*, // 一个打开的数据库实例
const char *sql, // 需要执行的SQL语句
int(*callback)(void *, int, char **, char **),// SQL语句执行完毕后的回调
void *, // 回调函数的第1个参数
char **errmsg // 错误信息
);
执行查询操作
NSString *sql = [NSString stringWithFormat:@"select name,price from %@",tableName];
//sqlite3_stmt实例,用来获得数据库数据
sqlite3_stmt *stmt = NULL;
//sqlite3_prepare_v2:预准备,其实就是分析SQL语句的合法性
if(sqlite3_prepare_v2 (self.db, sql.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
// 返回SQLITE_ROW代表成功取出一条数据
while(sqlite3_step(stmt) == SQLITE_ROW) {
const char *name = (const char *)sqlite3_column_text(stmt, 0);
const char *price = (const char *)sqlite3_column_text(stmt,1);
}
}
查询分三个阶段:
准备阶段:sqlite3_prepare_v2()
执行阶段:sqlte3_step()
终止阶段:sqlite3_finalize()
使用约束变量
sqlite3_bind是用来给sqlite3_stmt *pStmt语句增加值的,对于不同类型的参数要选用不同的函数。
例如,要执行带两个约束变量的插入操作,第一个变量是int类型,第二个是C字符串:
char*sql ="insert into oneTable values (?, ?);";
sqlite3_stmt *stmt;
if(sqlite3_prepare_v2(database, sql,-1, &stmt,nil) == SQLITE_OK) {
//参数一:sqlite3_stmt类型的变量
//参数二:所约束变量的标签index,(从1开始)
//参数三:是要加的值
sqlite3_bind_int(stmt,1,235);
//参数四:代表第三个参数中需要传递的长度。对于C字符串来说,-1表示传递全部字符串。
//参数五:是一个回调函数,比如执行后做内存清除工作。
sqlite3_bind_text(stmt,2,"valueString",-1,NULL);
}
if(sqlite3_step(stmt) != SQLITE_DONE)
NSLog(@"Something is Wrong!");
sqlite3_finalize(stmt);//销毁sqlit3_stmt *对象
未完待续...