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  



  • 相关阅读:
    627. Swap Salary
    176. Second Highest Salary
    596. Classes More Than 5 Students
    183. Customers Who Never Order
    181. Employees Earning More Than Their Managers
    182. Duplicate Emails
    175. Combine Two Tables
    620. Not Boring Movies
    595. Big Countries
    HDU 6034 Balala Power! (贪心+坑题)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3984498.html
Copyright © 2011-2022 走看看