sqliteiOS 数据储存之SQLite3的利用

SQLite3是iOS内嵌的数据库,SQLite3在存储和搜索大量多少方面非凡有效,它使得不必然每个对象都加到内存中。还可以够对数据开展承担的集合,与使用对象实施这多少个操作相比,拿到结果的进度更快。

SQLite3使用SQL结构化查询语言,SQL是与关系数据库交互的规范语言。

SQLite3的使用:

1、导入头文件

#import <sqlite3.h>

2、创造或者打开数据库

   //创建和打开数据库
    sqlite3 *database;

    //如果sqlite3_open的结果是 SQLITE_OK,表示数据库已经打开成功。
    //SQLite3是采用可移植的C,数据库的文件路径必须以C字符串(非NSString)的形式进行传递。
    if (sqlite3_open("/path/databaseFile", &database) != SQLITE_OK) 
   {
     sqlite3_close(database); NSAssert(0, @"Failed to open database"); 
  }

3、成立一个表

    //创建一个新表
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS "
    "(ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";
    char *errorMsg;

    //sqlite3_exec 针对 SQLite3 运行任何不返回数据的命令
    if (sqlite3_exec (database, [createSQL UTF8String],
                      NULL, NULL, &errorMsg) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Error creating table: %s", errorMsg);
    }

注:sqlite3_exec 执行之后,假如值是SQLITE_OK,则阐明执行成功;否则,错误消息存储在errorMsg中。

sqlite3_exec这多少个情势可以实施那么些没有重返结果的操作,例如成立、插入、删除等。

4、对表举行操作

4.1储存数据到数据库

    sqlite3 *database;
    if (sqlite3_open([[self dataFilePath] UTF8String], &database)
        != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to open database");
    }

     //例子:存储UITextField的值到数据库
    for (int i = 0; i < 4; i++) {
        UITextField *field = self.lineFields[i];

        //插入操作
        char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) "
        "VALUES (?, ?);";
        char *errorMsg = NULL;
        //创建stmt
        sqlite3_stmt *stmt;
        //无论针对哪种数据,任何绑定函数的第一个参数都指向之前在sqlite3_prepare_v2 调用中 使用的sqlite3_stmt
        if (sqlite3_prepare_v2(database, update, -1, &stmt, nil)
            == SQLITE_OK) {

            //SQLITE_OK 表示执行成功

            /*sqlite3_bind_int(stmt, 1, i);有三个参数:

            第一个是sqlite3_stmt类型的变量,在之前的sqlite3_prepare_v2中使用的。

            第二个是所约束变量的标签index。

            第三个参数是要加的值。*/

            sqlite3_bind_int(stmt, 1, i);
            sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
        }

        if (sqlite3_step(stmt) != SQLITE_DONE)
            NSAssert(0, @"Error updating table: %s", errorMsg);

        //sqlite3_finalize销毁前面被sqlite3_prepare创建的准备语句
        sqlite3_finalize(stmt);
    }
    //sqlite3_close关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放
    sqlite3_close(database);

4.2 对数据库进行询问操作

 

    //创建query 和 sqlite3_stmt
    NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";
    sqlite3_stmt *statement;

    //无论针对哪种数据,任何绑定函数的第一个参数都指向之前在sqlite3_prepare_v2 调用中 使用的sqlite3_stmt
    if (sqlite3_prepare_v2(database, [query UTF8String],
                           -1, &statement, nil) == SQLITE_OK)
    {
         //sqlite3_step用于执行有前面sqlite3_prepare创建的准备语句。这个语句执行到结果的第一行可用的位置。继续前进到结果的第二行的话,只需再次调用sqlite3_setp()。继续调用sqlite3_setp()知道这个语句完成,那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int row = sqlite3_column_int(statement, 0);
            char *rowData = (char *)sqlite3_column_text(statement, 1);

            NSString *fieldValue = [[NSString alloc]
                                    initWithUTF8String:rowData];
            UITextField *field = self.lineFields[row];
            field.text = fieldValue;
        }
        //sqlite3_finalize销毁前面被sqlite3_prepare创建的准备语句
        sqlite3_finalize(statement);
    }
    //sqlite3_close关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放
    sqlite3_close(database);

5、使用约束变量

实际操作时日常使用叫做约束变量的东西来布局SQL字符串,从而举行扦插、查询或者去除等。

比如说,要实施带两个约束变量的插入操作,首个变量是int类型,第二个是C字符串:

char *sql = "insert into oneTable values (?, ?);";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, sql, -1, &stmt, nil) == SQLITE_OK) {
    sqlite3_bind_int(stmt, 1, 235);
    sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);
}
if (sqlite3_step(stmt) != SQLITE_DONE)
    NSLog(@"Something is Wrong!");
sqlite3_finalize(stmt);

这里,sqlite3_bind_int(stmt, 1, 235);有六个参数:

率先个是sqlite3_stmt类型的变量,在前头的sqlite3_prepare_v2中运用的。

其次个是所羁绊变量的价签index。

其六个参数是要加的值。

有一些函数多出七个变量,例如

sqlite3_bind_text(stmt, 2, "valueString", -1, NULL);

这句,第五个参数代表第两个参数中需要传递的长短。对于C字符串来说,-1代表传递全体字符串。

第六个参数是一个回调函数,比如执行后做内存清除工作。

 

6、SQLite3中常用的函数

sqlite3_open():打开数据库,在操作数据库在此以前,首先要开辟数据库。这多少个函数打开一个sqlite数据库文件的接连并且重回一个数据库连接对象。那个操作同时程序中的第一个调用的sqlite函数,同时也是其余sqlite
api的先决条件。许多的sqlite接口函数都亟需一个数据库连接对象的指针作为它们的率先个参数。

sqlite3_prepare():将sql文本转换成一个准备语句(prepared
statement)对象,同时再次来到这么些目的的指针。这些接口需要一个数据库连接指针以及一个要未雨绸缪的蕴藏SQL语句的文本。它其实并不执行(evaluate)那个SQL语句,它不过为实施准备那些sql语句。

sqlite3_step():执行有前方sqlite3_prepare创造的准备语句。这些讲话执行到结果的率先行可用的地方。继续发展到结果的第二行的话,只需再一次调用sqlite3_setp()。继续调用sqlite3_setp()知道这么些讲话完成,那一个不回去结果的讲话(如:INSERT,UPDATE,或DELETE),sqlite3_step()只举办五次就回来。

sqlite3_column():执行sqlite3_step()执行一个准备语句得到的结果集的眼前行中回到一个列。每一次sqlite3_step得到一个结实集的列停下后,这个历程就足以被反复调用去查询这么些行的各列的值。对列操作是有两个函数,均以sqlite3_column为前缀。

sqlite3_finalize():销毁前面被sqlite3_prepare创制的备选语句,每个准备语句都必须使用这么些函数去销毁以防范内存泄露。在空指针上调用这一个函数没有什么样影响,同时可以准备语句的生命周期的任一时刻调用这个函数:在言语被实施前,五次或频繁调用sqlite_reset之后,或者在sqlite3_step任何调用之后不管语句是否到位实施

sqlite3_close():关闭前边使用sqlite3_open打开的数据库连接,任何与这么些连续相关的备选语句必须在调用那些闭馆函数以前被释放

 

网站地图xml地图