sqlite:
iPhone中支持通过sqlite3来访问iPhone本地的数据库。
使用:
添加开发包libsqlite3.0.dylib(xcode7后libsqlite3.0.tbd)
导入头文件 #import <sqlite3.h>
1,打开数据库
2,操作数据库
<1>建表:必须的
<2>增加:不会自动辨别是否有重复数据,而是重复插入(设置主键之外)
<3>删除
<4>修改
<5>查询
3,关闭数据库
基本语法
int sqlite3_open(
const char *filename, // 数据库的文件路径
sqlite3 **ppDb // 数据库实例
);
执行任何SQL语句
int sqlite3_exec(
sqlite3*, // 一个打开的数据库实例
const char *sql, // 需要执行的SQL语句
int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
void *, // 回调函数的第1个参数
char **errmsg // 错误信息
);
检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2(
sqlite3 *db, // 数据库实例
const char *zSql, // 需要检查的SQL语句
int nByte, // SQL语句的最大字节长度
sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据
const char **pzTail
);
查询一行数据
int sqlite3_step(sqlite3_stmt*); // 如果查询到一行数据,就会返回SQLITE_ROW
利用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); // 字符串数据
具体实现
1,打开数据库
//变量命名:全局变量最好以_为开始或者以m为开始,局部变量以原始名称为命名方式
sqlite3 *_db = NULL;
NSArray *pathesArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [pathesArr firstObject];
NSLog(@"%@",path);
//数据库的后缀名以.db为结尾
NSString *databasePath = [path stringByAppendingPathComponent:@"sqlite.db"];
//判断databasePath路径是否存在,如果不存在则自动创建,然后打开,再判断是否能够打开成功
int open = sqlite3_open(databasePath.UTF8String, &_db);
//SQLITE_OK,则表示成功打开数据库
if (open == SQLITE_OK) {
NSLog(@"打开成功");
}
2,操作数据库
<1>建表:
char *error = NULL;
NSString *sqlStr = @"create table if not exists myTable (id integer primary key autoincrement,name text,height float);";
//sqlStr.UTF8String 把NSString转换成C语言字符串类型(char *)
int result = sqlite3_exec(_db, sqlStr.UTF8String, NULL, NULL, &error);
if (result == SQLITE_OK) {
NSLog(@"创建成功");
}else
{
NSLog(@"%s",error);
}
//1.增
//《1》没有占位符 --->增
NSString *insertSql = @"insert into myTable (id,name,height) values (66,'wangbing',172.0);";
int insertResult = sqlite3_exec(_db, insertSql.UTF8String, NULL, NULL, &error);
if (insertResult == SQLITE_OK)
{
NSLog(@"插入成功");
}else
{
NSLog(@"插入失败 error = %s",error);
}
// 《2》有占位符 --->增
char *insertSql = "insert into myTable(name,height) values( ?, ?) ;";
sqlite3_stmt *stmt = NULL;
int prepareResult = sqlite3_prepare_v2(_db, insertSql, -1, &stmt, NULL);
if (prepareResult == SQLITE_OK) {
// sqlite3_bind_text():大部分绑定函数都只有3个参数
//(1)第1个参数是sqlite3_stmt *类型
//(2)第2个参数指占位符的位置,第一个占位符的位置是1,不是0
//(3)第3个参数指占位符要绑定的值
//(4)第4个参数指在第3个参数中所传递数据的长度,对于C字符串,可以传递-1代替字符串的长度
//(5)第5个参数是一个可选的函数回调,一般用于在语句执行后完成内存清理工作
sqlite3_bind_text(stmt, 1, "doubi", -1, NULL);
sqlite3_bind_double(stmt, 2, 173);
}
//sqlite_step():执行SQL语句,返回SQLITE_DONE代表成功执行完毕
if (sqlite3_step(stmt)!= SQLITE_DONE ) {
NSLog(@"插入数据错误");
}
//sqlite_finalize():销毁sqlite3_stmt *对象
sqlite3_finalize(stmt);
<3>删除
NSString *deleteSql = @"DELETE FROM myTable WHERE id = 2;";
if (sqlite3_exec(_db, deleteSql.UTF8String, NULL, NULL, &error))
{
NSLog(@"删除成功");
}
<4>修改
NSString *updateSql = @"UPDATE myTable SET name = 'sb' WHERE id = 14 ;";
int updateResult = sqlite3_exec(_db, updateSql.UTF8String, NULL, NULL, &error);
if (updateResult == SQLITE_OK) {
NSLog(@"修改成功");
}
<5>查询
char *selectSql = "select id,name,height from myTable where id = 15;";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(_db, selectSql, -1, &stmt, NULL) == SQLITE_OK) {
// sqlite3_step()返回SQLITE_ROW代表遍历到一条新记录
while (sqlite3_step(stmt) == SQLITE_ROW) {
//sqlite3_column_*()用于获取每个字段对应的值,第2个参数是字段的索引,从0开始
int _id = sqlite3_column_int(stmt, 0);
char *_name = (char *)sqlite3_column_text(stmt, 1);
NSString *name = [NSString stringWithUTF8String:_name];
double _height = sqlite3_column_double (stmt, 2);
NSLog(@"id=%i, name=%@, height=%lf", _id, name, _height);
}
}
sqlite3_finalize(stmt);