zoukankan      html  css  js  c++  java
  • 【iOS】使用SQLite与FMDB

    iOS中的SQLite与Android中的一模一样,仅仅是调用方法有差异。假设单从调用来讲,Android封装的一套helper更好用一些,而iOS原生的用C语言的几个函数在操作,比較麻烦。只是引入第三方框架FMDB,使用起来就方便非常多。


    一、SQLite的基本使用

    使用步骤:

    1.导入系统框架(C语言). (libsqlite3)
    2.头文件#import<sqlite3.h>.
    3. sqlite3_open(fileName.UTF8String, &_db); 打开或者创建一个数据
    *_db自定义一个sqlite3的成员变量.进行正删改查时要用.
    4.sqlite3_exec(_db, sql, NULL, NULL,&error);
    *该函数可进行insert,delete,update操作.
    5.查询操作select.
    *sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);做查询前准备,检測SQL语句是否正确.
    *sqlite3_step(stmt) 提取查询到的数据,一次提取一条.
    *sqlite3_column_text(stmt, 0)取出第0列的数据.

    直接看代码更易懂:
    创建或打开数据库:
       // 0.获取文件地址
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"];
        
    	// 1.打开或者创建一个数据库
        // (1.假设数据库不存在就会自己主动创建数据库并打开, 2.假设数据库存储就会自己主动打开数据库)
        int result = sqlite3_open(fileName.UTF8String, &_db);
        if (result == SQLITE_OK) {
            NSLog(@"打开数据库成功");
            // 2.创建表
            /**
             sqlite3 传递已经打开的数据库
             sql: 须要运行的数据库语句
             */
            const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);";
            char *error = nil;
            // 在db数据库中运行sql语句
            sqlite3_exec(self.db, sql, NULL, NULL, &error);
            if (error) {
                NSLog(@"创建表失败");
            }else
            {
                NSLog(@"创建表成功");
            }
        }else
        {
             NSLog(@"打开数据库失败");
        }

    插入数据:(更新,删除与此类似)
    // 1.拼接插入sql语句
            NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i];
            int age = arc4random_uniform(100);
            NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(name, age) VALUES ('%@', %d);", name, age];
            char *error = nil;
            // 2.运行插入sql语句
            sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error);
            if (error) {
                NSLog(@"加入失败");
            }else
            {
                NSLog(@"加入成功");
            }

    查询数据:
    const char *sql = "SELECT name, age FROM t_student;";
    //    char *error = nil;
    //    sqlite3_exec(self.db, sql, NULL, NULL, &error);
        sqlite3_stmt *stmt; // 用于提取数据的
        // 1.做查询前的准备, 检查sql语句是否正确
        int result = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL);
        if (result == SQLITE_OK) {// 准备完毕, 没有错误
            // 2.提取查询到的数据到stmt, 一次提取一条
            // 假设返回值为SQLITE_ROW, 就代表提取到了一条记录
           while(sqlite3_step(stmt) == SQLITE_ROW)
           {
               // 3.取出提取到的记录(数据)中的第0列的数据
               const unsigned char *name = sqlite3_column_text(stmt, 0);
               int age = sqlite3_column_int(stmt, 1);
               NSLog(@"%s %d", name, age);
           }
        }

    二、FMDB的使用
    FMDB的优点是对基本C库的封装,方便使用。同一时候还提供了多线程操作数据库带来的读脏数据等问题的方法。


    使用:(须要FMDatabase *db成员变量
    创建或打开:
    // 0.获取沙盒路径
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"];
        
    	// 1.获得数据库对象
        self.db = [FMDatabase databaseWithPath:fileName];
        
        // 2.打开数据库
        if ([self.db open]) {
            NSLog(@"打开成功");
            // 2.1创建表
           BOOL success =  [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, age INTEGER NOT NULL);"];
            if (success) {
                NSLog(@"创建表成功");
            }else
            {
                NSLog(@"创建表失败");
            }
        }else
        {
            NSLog(@"打开失败");
        }

    插入操作:(更新,删除与此类似)
    BOOL success = [self.db executeUpdate:@"INSERT INTO t_student(name , age) VALUES(?, ?);", @"xuneng", @(10)];// 注意仅仅能拼接对象类型
            if (success) {
                NSLog(@"加入成功");
            }else
            {
                NSLog(@"加入失败");
            }

    查询:
    // 1.查询
        FMResultSet *set = [self.db  executeQuery:@"SELECT * FROM t_student;"];
        
        // 2.取出数据
        while ([set next]) {
            
            // 取出姓名
    //       NSString *name = [set stringForColumnIndex:1];
            // 取出年龄
    //       int age = [set intForColumnIndex:2];
            NSString *name = [set stringForColumn:@"name"];
            int age = [set intForColumn:@"age"];
            NSLog(@"name = %@, age = %d", name, age);
        }

    FMDB还能定义操作队列FMDatabaseQueue,这个队列是线程安全的。(FMDatabase不是线程安全的

    同一时候还能开启事物、提交事物。使用相当方便。

    可參照https://github.com/ccgus/fmdb上进行学习,写的相当具体。


    转载请注明出处:http://blog.csdn.net/xn4545945  



  • 相关阅读:
    sql相关操作
    web前端技术归类
    在EasyUI中统一判断是否有选中行,如果有则将选中行数据传入回调函数
    几种不同的分页处理办法
    将json格式日期(毫秒数)转成日常日期格式和日常格式时间对比
    在asp.net中导出表格Excel数据
    生成html文件
    EasyUI时间格式化
    checkbox,radio,selected相关操作
    javascript生成n至m的随机整数
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3984498.html
Copyright © 2011-2022 走看看