iOS点点滴滴

iOS开发之SQLite

2017-11-25  本文已影响0人  刹那年华逝

1.SQLite简介

SQLite 是一种轻量级的关系型数据库,其最初的设计目标是用于嵌入式系统。它占用资源少,处理速度快。能够支持Windows/Linux/Unix/Mac OS X/iOS等等主流的操作系统。现在最新的版本是SQLite3

2.在iOS开发中使用SQLite

2.1 导入动态库libsqlite3.tbd

2.1.2导入头文件
#import <sqlite3.h>

导入动态库要用尖括号

2.2 创建数据库

2.2.1 拼接数据保存沙盒路径

将数据库文件保存在Document文件夹中,数据库文件名按你的需求写

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"data.sqlite"];

对沙盒不太熟悉的读者可以参考我上一篇博客iOS开发之沙盒机制

2.2.2 创建数据库文件

使用sqlite3_open()函数,该函数会打开指定路径数据库文件,如果该文件不存在 就会在该路径下创建数据库文件

    //创建sqlite3数据库句柄
    sqlite3 *ppDb = NULL;

    //参数1:待打开(创建)的数据库文件名 由于是sqlite3_open是c语言函数 需要将NSString类型的path转化为char *类型
    //参数2:sqlite3数据库句柄的指针
    //返回值: int类型 为0(SQLITE_OK)时表示创建成功
    int success = sqlite3_open(path.UTF8String, &ppDb);

    //判断创建是否成功
    if (success == SQLITE_OK) {
        NSLog(@"数据库创建成功");

        //输出数据库文件保存路径
        NSLog(@"数据库保存位置:%@",path);
    }else{
        NSLog(@"数据库创建失败");
    }

2.3 创建表

2.3.1 创建SQL语句

对SQL语句不太了解的读者可以自行百度
下面SQL语句意思是 如果t_student 表不存在,就创建一个名为t_student的表。这个表有三列。第一列列名为ID ,INTEGER(整形)类型,是主键,自动增长。第二列列名为name,TEXT(字符串)类型,不允许为空。第三列列名为score,REAL(浮点)类型,默认值是60.0

   NSString *sql = @"CREATE TABLE IF NOT EXISTS t_student(ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL DEFAULT 60.0);";
2.3.2 执行上面的SQL语句
   //创建并初始化错误信息指针
    char *errmsg = NULL;

    //调用sqlite3_exec()函数执行SQL语句
    //参数一:要打开的数据库句柄
    //参数二:要执行的SQL语句 由于是sqlite3_open是c语言函数 需要将NSString类型的sql转化为char *类型
    //参数三:回调函数 
    //参数四:回调函数的第一个参数
    //参数五:错误信息,是指向错误消息字符串的指针
    //返回值: int类型 为0(SQLITE_OK)时表示SQL语句执行成功
    int success_t = sqlite3_exec(ppDb, sql.UTF8String, NULL, NULL, &errmsg);

    //判断表是否创建成功
    if (success_t == SQLITE_OK) {
        NSLog(@"表创建成功");
    }else{
        NSLog(@"表创建失败");

        //输出错误信息
       NSLog(@"错误信息:%s",errmsg);
    }

2.4 在表中插入数据

2.4.1 创建SQL语句

下面SQL语句的意思是 向t_student表中插入一条数据,其中name字段的值为Allen,score字段的值为80.0

    NSString *sql = @"INSERT INTO t_student(name,score) VALUES('Allen',80.0);";
2.4.2 执行SQL语句
    char *errmsg = NULL;
    int success_i = sqlite3_exec(ppDb, sql.UTF8String, NULL, NULL, &errmsg);
    if (success_i == SQLITE_OK) {
        NSLog(@"数据插入成功");
    }else{
        NSLog(@"数据插入失败");
        NSLog(@"错误信息:%s",errmsg);
    }

2.5 删除数据

2.5.1 创建SQL语句

这句SQL语句意思是 删除 t_student表中分数小于60的数据

    NSString *sql = @"DELETE FROM  t_student WHERE score < 60;";
2.5.2 执行SQL语句
    char *errmsg = NULL;
    int success_d = sqlite3_exec(ppDb, sql.UTF8String, NULL, NULL, &errmsg);
    if (success_d == SQLITE_OK) {
        NSLog(@"删除数据成功");
    }else{
        NSLog(@"删除数据失败");
        NSLog(@"错误信息:%s",errmsg);
    }

2.6 修改数据

2.6.1 创建SQL语句

下面SQL语句的意思是 将t_student表中score = 80 的数据全部改成score = 90

    NSString *sql = @"UPDATE t_student SET score = 90 WHERE score = 80;";
2.6.2 执行SQL语句
    char *errmsg = NULL;
    int success_d = sqlite3_exec(ppDb, sql.UTF8String, NULL, NULL, &errmsg);
    if (success_d == SQLITE_OK) {
        NSLog(@"修改数据成功");
    }else{
        NSLog(@"修改数据失败");
        NSLog(@"错误信息:%s",errmsg);
    }

2.7 查询数据

2.7.1 创建SQL语句

下面SQL语句的意思是 查询t_student表中 score > 80的所有数据

NSString *sql = @"SELECT * FROM t_student WHERE score > 80";
2.7.2 执行SQL语句
    //初始化Statement句柄
    sqlite3_stmt *ppStmt = NULL;

    /*
     使用 sqlite3_prepare_v2()函数执行SQL查询语句
     参数一:要查询的数据库句柄
     参数二:要执行的SQL语句,由于是sqlite3_open是c语言函数 需要将NSString类型的sql转化为char *类型
     参数三:这个函数能从SQL语句中读取的字节数的最大值,如果不限制SQL语句长度,填-1即可
     参数四:Statement句柄,保存最终结果
     参数五:保留字段
     返回值: int类型 为0(SQLITE_OK)时表示SQL语句执行成功
     */
    int success_s = sqlite3_prepare_v2(ppDb, sql.UTF8String, -1, &ppStmt, NULL);
2.7.3 获取Statement句柄中保存的查询结果
    if (success_s == SQLITE_OK) {
        NSLog(@"数据查询成功");

        //遍历Statement句柄中的数据
        while (sqlite3_step(ppStmt) == SQLITE_ROW) {
            //获取当前行第0列的数据
            int ID = sqlite3_column_int(ppStmt, 0);

            //获取当前行第1列的数据
            const unsigned char *name = sqlite3_column_text(ppStmt, 1);

            //获取当前行第2列的数据
            double score = sqlite3_column_double(ppStmt, 2);

            //输出获取到的结果
            NSLog(@"ID = %d name = %s score = %lf",ID,name,score);
        }
    }else{
        NSLog(@"数据查询失败");
    }

如果你有不同的见解 或文章有错误之处 希望能够指出 谢谢

上一篇下一篇

猜你喜欢

热点阅读