ios数据存储(二)

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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值