【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库的封装,方便使用。同时还提供了多线程操作数据库带来的读脏数据等问题的方法。

框架地址:https://github.com/ccgus/fmdb

使用:(需要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  

时间: 2024-12-24 05:38:44

【iOS】使用SQLite与FMDB的相关文章

iOS之sqlite和FMDB

数据库sqlite在iOS中起着举足轻重的作用,本文主要讲述一下sqlite的并发,事务和常见的损坏问题,后面会简述一下对sqlite进一步封装的第三方库FMDB. sqlite的并发和事务 在了解sqlite的事务和并发之前,我们要先了解sqlite提供的几种锁的类型及区别.sqlite提供了五种级别的锁: UNLOCKED(未锁定):当前数据库不存在读写操作.为默认状态. SHARED(共享锁):当前数据库可以被读取,但是不能执行写操作.同一时刻,可以有任意的进程持有该数据库的共享锁,所以s

iOS开发数据库篇—FMDB数据库队列(下)

iOS开发数据库篇—FMDB数据库队列(下) 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05-FMDB数据库队列 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "Y

[iOS]数据库第三方框架FMDB详细讲解

[iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等. FMDB是一款简洁.易用的封装库.因此,在这里推荐使用第三方框架FMDB,它是对libsqlite3框架的封装,用起来的步骤与SQLite使用类似,并且它对于多线程的并发操作进行了处理,所以

IOS开发之数据库FMDB

IOS开发之数据库FMDB 1.简介 需求作用:如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目 常用的数据库: (1)Microsoft SQL Server 2000/2008:中小企业使用较多 (2)Oracle:比较复杂, 大企业使用较多 (3)Mysql数据库:网站使用较多 (4)sqlite:本地数据库, 访问数据足够快, 直接访问文件  足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了  足够小, 系统不超过1M, 适合在移动端上使用 2. Me

iOS开发数据库篇—FMDB简单介绍

iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDa

数据持久化-CoreData、SQLite、FMDB

1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core Data 基于model-view-controller(mvc)模式下,为创建分解的cocoa应用程序提供了一个灵活和强大的数据模型框架. 3)Core Data可以是你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它. Core Data提供了基础结构去处理常用的功能,例如:保存,恢复,撤销和重做,允许你在app中继续创建新的任务.在使用 Core Da

iOS开发数据库篇—FMDB数据库队列

iOS开发数据库篇—FMDB数据库队列 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05-FMDB数据库队列 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "YYVi

iOS 数据库操作(使用FMDB)

iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包.

我为什么用 SQLite 和 FMDB 而不用 Core Data

转:http://segmentfault.com/a/1190000000363392 编者注:文章的"我"是指原作者. 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和精力去写自己的系统去代替它.真的,使用Core Data吧. 为什么我不使用Core Data Mike Ash写到: 就我自己而言,我不是个狂热粉丝.我发现API是

iOS数据持久化之数据库:SQLite和FMDB

SQLite: SQLite是一款轻量级型的数据库,资源占用少.性能良好和零管理成本,具有零配置(无需安装和管理配置).独立(没有额外依赖).储存在单一磁盘文件中的一个完整的数据库.源码完全的开源.比一些流行的数据库在大部分普通数据库操作要快……功能特性:在大型系统和处理大批量数据时不适用      SQLite引擎不是程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分,所以主要的通信协议是在编程语言内的直接API调用:在APP开发中将SQLite集成到应用的沙盒目录下(SQLite是