iOS SQLite3

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









未完待续...

你可能感兴趣的:(iOS SQLite3)