程序员

iOS开发-Sqlite基本使用

2017-02-17  本文已影响0人  037e3257fa3b

0.准备工作

// 导入sqlite3框架,必要时导入相应xi't
#import <sqlite3.h>

// 声明一个数据库属性
@property (nonatomic, assign) sqlite3 *db;

1.打开数据库并创建表

// 0.获取沙盒地址
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
    
    // 1.打开数据
    // sqlite3 *db; // 一个db就代表一个数据库
    // open会先判断数据库文件是否存在, 如果不存在会自动创建数据库文件, 然后再打开数据
    // open会返回一个int类型的值, 这个值代表着打开数据库是否成功
    int result = sqlite3_open(sqlFilePath.UTF8String, &_db);
    if (SQLITE_OK == result) {
        NSLog(@"数据库打开成功");
        
        // 2.创建表
        const char *sql = "CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, score REAL DEFAULT 1);";
        char *error;
        /*
          第1参数:需要执行sql语句的数据库
          第2参数:需要执行的sql语句
          第3参数:执行完sql语句之后的回调方法
          第4参数:回调方法的参数
          第5参数:错误信息
         */
        sqlite3_exec(_db, sql, NULL, NULL, &error);
        if (error) {
            NSLog(@"创建表失败");
        }else
        {
            NSLog(@"创建表成功");
        }
    }else
    {
        NSLog(@"数据库打开失败");
    }

2.插入数据

for (int i = 0; i < 100; i++) {
        int score = arc4random_uniform(100);
        NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i];
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(score, name) VALUES (%d, '%@');", score, name];
        
        char *error;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
        if (error) {
            NSLog(@"插入失败");
        }else
        {
            NSLog(@"插入成功");
        }
    }

3.删除数据

- (IBAction)deleteOnClick {
    
    NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE NAME = '%@';", @"Jonathan-6"];
    
    char *error;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
    if (error) {
        NSLog(@"删除失败");
    }else
    {
        NSLog(@"删除成功");
    }
}

4.更新数据

NSString *sql = [NSString stringWithFormat:@"UPDATE t_student SET NAME = '%@' WHERE NAME = '%@';",@"Jonathan-66", @"Jonathan-6"];
    
    char *error;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &error);
    if (error) {
        NSLog(@"更新失败");
    }else
    {
        NSLog(@"更新成功");
    }

5.查询数据

char *sql = "SELECT id, name, score FROM t_student;";
//    char *error;
//    sqlite3_exec(_db, sql, NULL, NULL, &error);
    // 1.准备查询
    /*
     第1参数:需要执行sql语句的数据库
     第2参数:需要执行的sql语句
     第3参数:sql语句长度, 如果传递一个小于0的数, 系统会自动帮我们计算
     第4参数:用于提取数据的变量
     */
    sqlite3_stmt *stmt; // 用于提取数据的变量
    int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
    // 2.判断是否准备好
    if (SQLITE_OK == result) {
        // 准备好了
        // 2.1提取数据
        // step方法会将数据提取到stmt中, 一次只能提取一条数据
//        int row =  sqlite3_step(stmt);
        while (SQLITE_ROW == sqlite3_step(stmt)) { // 提取到一条数据
            // 从stmt中取出提取到的数据
            int ID =  sqlite3_column_int(stmt, 0);
            const unsigned char * name = sqlite3_column_text(stmt, 1);
            double score = sqlite3_column_double(stmt, 2);
            NSLog(@"%d %s %.1f", ID, name, score);
        }
    }

6.封装重复的操作

对于创建表、插入、更新、删除操作,我们都可以调用下面的方法,返回为YES代表执行成功,反之则失败。

- (BOOL)sqliteExecOperation:(NSString *)sql
{
    return sqlite3_exec(_db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK;
}
上一篇 下一篇

猜你喜欢

热点阅读