美文网首页
iOS SQLite3

iOS SQLite3

作者: 肉肉要次肉 | 来源:发表于2018-07-19 17:59 被阅读21次

    SQLite3是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小

    SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中

    在iOS中使用SQLite3,首先要添加库文件 libsqlite3.dylib 和 导入主头文件#import<sqlite3.h>

    //数据库在沙盒中的存放路径

    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 *对象

    未完待续...

    相关文章

      网友评论

          本文标题:iOS SQLite3

          本文链接:https://www.haomeiwen.com/subject/rwazpftx.html