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

SQLite:

  SQLite是一款轻量级型的数据库,资源占用少、性能良好和零管理成本,具有零配置无需安装和管理配置)、独立(没有额外依赖)、储存在单一磁盘文件中的一个完整的数据库源码完全的开源、比一些流行的数据库在大部分普通数据库操作要快……功能特性;在大型系统和处理大批量数据时不适用

     SQLite引擎不是程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分,所以主要的通信协议是在编程语言内的直接API调用;在APP开发中将SQLite集成到应用的沙盒目录下(SQLite是以文件形式存在),用于缓存数据到本地,通过Objective-C可以直接调用SQLite的API来访问本地数据

SQLite在iOS开发通常不直接使用,API代码调用很繁琐,因此一般使用第三方框架FMDB或iOS封装的原生的CoreData;使用SQLite需要导入最新SQLite 3.0/SQLite 3框架,而且可以通过代码直接创建SQLite文件和表,需要注意的是数据库每次操作前都需要开库,在每次操作完毕后都需要关闭数据库;如果直接使用SQLite还需要通过FireFox的SQLite Manager创建SQLite文件和表



FMDB:

12.00

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

  FMDB是对操作SQLite的封装,框架实现了通过代码直接创建表的功能,建表前判断表是否存在,不存在才创建,因此开库操作就是调用建表方法;FMDB将对数据库的操作分为两类:修改(update)和查询(query)

FMDB只是封装了对SQLite的操作,因此在使用时还需要创建数据库管理类:DBManager,其对建表(开库)、操作类型(每次操作完后关库)进行封装;当数据库和模型绑定时,需要在数据库的操作类型中进行数据的模型化操作,操作模型即能实现和数据库的关联,而且每一种操作类型都能被够复用

1. FMDB的下载地址 https://github.com/ccgus/fmdb

2. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包

3. FMDB常用类

  FMDatabase : 一个单一的SQLite数据库,用于执行SQL语句。

  FMResultSet :执行查询一个FMDatabase结果集。

  FMDatabaseQueue :在多个线程来执行查询和更新时会使用这个类

对FMDB操作类型的封装,DMManager类封装的对数据的增删改查、指定查询、建表(开库)、模型转换操作

#import "DBMamager.h"
#import "FMDB.h"

// 宏定义表的关键字
#define TABNAME @"MEMBER"
#define ID      @"MEMID"
#define NAME    @"MEMNAME"
#define SEX     @"MEMSEX"
#define TEL     @"MEMTEL"
#define QQ      @"MEMQQ"
#define DB      @"member.sqlite"

@interface DBMamager ()

@property (nonatomic, strong)FMDatabase *db;
@property (nonatomic, strong)NSString *pathDB;
@end
@implementation DBMamager

// 建表
- (void)createDB
{
    _pathDB = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:DB];
    _db = [FMDatabase databaseWithPath:_pathDB];
    if ([_db open])
    {
        NSString *sql  = [NSString stringWithFormat:@"create table if not exists ‘%@‘ (‘%@‘ integer primary key autoincrement, ‘%@‘ varchar(20), ‘%@‘ varchar(10),‘%@‘ varchar(20),‘%@‘ varchar(20))", TABNAME, ID, NAME, SEX, QQ, TEL];
        [_db executeUpdate:sql];

    }
    [_db close];
}

// 查询所有
- (NSMutableArray *)getallMember
{
    NSMutableArray *stus = [NSMutableArray array];

    if ([_db open])
    {
        NSString *sql = [NSString stringWithFormat:@"select * from %@", TABNAME];

        FMResultSet *resultSet = [_db executeQuery:sql];

        while (resultSet.next)
        {
            Member *mem = [[Member alloc] initWithDic:
                           @{@"memid":@([resultSet intForColumn:ID]),
                             @"name":[resultSet stringForColumn:NAME],
                             @"sex":[resultSet stringForColumn:SEX],
                             @"qq":[resultSet stringForColumn:QQ],
                             @"tel":[resultSet stringForColumn:TEL]
                             }];

            [stus addObject:mem];
        }
    }
    [_db close];
    return stus;
}

// 增加
- (BOOL)insertMember:(Member *)mem
{
    if ([_db open])
    {
        NSString *sql = [NSString stringWithFormat:@"insert into %@(%@, %@, %@, %@) values(‘%@‘, ‘%@‘, ‘%@‘, ‘%@‘)", TABNAME, NAME, SEX, QQ, TEL, mem.name, mem.sex, mem.qq, mem.tel];
        return [_db executeUpdate:sql];
    }
    [_db close];
    return NO;
}

// 删除
- (BOOL)deleteMember:(NSInteger)memid
{
    if ([_db open])
    {
        NSString *sql = [NSString stringWithFormat:@"delete from %@ where %@ = %lu", TABNAME, ID, memid];
        return [_db executeUpdate:sql];
    }
    [_db close];
    return NO;
}

// 修改
- (BOOL)updateMember:(Member *)mem
{
    if ([_db open])
    {
        NSString *sql = [NSString stringWithFormat:@"update %@ set %@ = ‘%@‘, %@ = ‘%@‘, %@ = ‘%@‘, %@ = ‘%@‘ where %@ = %lu", TABNAME, NAME, mem.name, SEX, mem.sex, QQ, mem.qq, TEL, mem.tel, ID, mem.memid];
        return [_db executeUpdate:sql];
    }
    [_db close];
    return NO;
}

// 指定memid查询
- (Member *)selectMember:(NSInteger)memid
{
    if ([_db open])
    {
        NSString *sql = [NSString stringWithFormat:@"select * from %@ where %@ = %lu", TABNAME, ID, memid];

        FMResultSet *resultSet = [_db executeQuery:sql];
        while (resultSet.next)
        {
            Member *mem = [[Member alloc] initWithDic:
                           @{@"memid":@([resultSet intForColumn:ID]),
                             @"name":[resultSet stringForColumn:NAME],
                             @"sex":[resultSet stringForColumn:SEX],
                             @"qq":[resultSet stringForColumn:QQ],
                             @"tel":[resultSet stringForColumn:TEL]
                             }];
            return mem;
        }
    }
    return nil;
}
@end

4. 如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使 化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理

//2多线程操作
      NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    path=[path stringByAppendingPathComponent:@"test.sqlite"];

    FMDatabaseQueue * queue=[FMDatabaseQueue databaseQueueWithPath:path];
    [queue inDatabase:^(FMDatabase *db) {
        NSString * create=@"create table if not exists t_book(id integer,name varchar)";
        BOOL c1= [db executeUpdate:create];
        if(c1){
            NSLog(@"成功");
        }

    }];

    [queue inDatabase:^(FMDatabase *db) {
            NSString * insertSql=@"insert into t_book(id,name) values(?,?)";

          //插入语句1
            bool inflag=[db executeUpdate:insertSql,@(2),@"admin"];
           if(inflag){
               NSLog(@"插入成功");
           }

    }];

    [queue inDatabase:^(FMDatabase *db) {

        FMResultSet * data=[db executeQuery:@" select * from t_book "];

        while (data.next) {

            int ids=[data intForColumn:@"id"];
            NSString *name=[data stringForColumn:@"name"];
            NSLog(@"%@",name);
            NSLog(@"%i",ids);
        }
    }];

12.00

FMDB是对操作SQLite的封装,框架实现了通过代码直接创建表的功能,建表前判断表是否存在,不存在才创建,因此开库操作就是调用建表方法;FMDB将对数据库的操作分为两类:修改(update)和查询(query)

FMDB只是封装了对SQLite的操作,因此在使用时还需要创建数据库管理类:DBManager,其对建表(开库)、操作类型(每次操作完后关库)进行封装;当数据库和模型绑定时,需要在数据库的操作类型中进行数据的模型化操作,操作模型即能实现和数据库的关联,而且每一种操作类型都能被够复用

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

时间: 2024-10-29 19:10:34

iOS数据持久化之数据库:SQLite和FMDB的相关文章

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

IOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等) 下面主要来介绍一个归档NSKeyedArchiver. 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象. 归档方式: 对Foundation框架中对象进行归档 对自定义的内容进行归档

iOS数据持久化方式分析

iOS数据持久化的方式一般为:plist文件写入.对象归档.SQLite数据库.CoreData. plist文件写入.对象归档一般用于小的数据量. SQLite数据库.CoreData则用于大的数据量. SQLite是一款轻型的数据库,是一种关系型数据库管理系统,他的设计目的是嵌入式设备中使用. SQLite占用资源非常低,非常适合移动设备中使用,而且是开源免费的 SQLite的数据库操作其实和常规的数据库操作流程是一样的: 1.打开数据库 sqlite3_open() 2.准备SQL语句,采

iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象.本文主要介绍swift实现iOS数据归档. 归档Foundation框架对象 func archiveData(){ var path: AnyObject=NS

iOS -数据持久化方式-以真实项目讲解

前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎么会使用到这些方式,都会以本人实际开发的场景为例,大约需要花10-15分钟,欢迎大家指正. 一.前言 和大家说一个真实故事,前年我去美图面试(当时的技术仅仅是UI和接口的实现,并不注重很多底层实现和很多概念的原理,换句话说,就是真正的码农),过了技术第一轮和第二轮(前两年的也就是问问技术点的实现),

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

ios开发学习笔记--数据持久化之数据库(SQLite.swift)

数据持久化之SQLite数据库(SQLite.swift使用) 一.     简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还快.SQLite提供的是一些C函数接口,你可以用这些函数操作数据库.通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 SQLite函数,SQLite就会为你操作数据库 一个数据库中的表就算是一个文件,一般是将这个文件放

iOS数据持久化-OC

沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1.1.每个应用程序都有自己的存储空间 1.2.应用程序不能翻过自己的围墙去访问别的存储空间的内容 1.3.应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行. 通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容

IOS数据持久化的4种方式

9.1 数据持久化概述 9.2 iOS应用程序目录结构 9.3 读写属性列表 9.4 对象归档 9.5 访问SQLite 9.1 数据持久化概述 iOS中可以有四种持久化数据的方式: 属性列表.对象归档.SQLite3和Core Data 9.2 iOS应用程序目录结构 iOS应用程序运行在Mac os模拟器时候,有一下临时目录模拟器3.1.3为例子: /Users/tony/Library/Application Support/iPhone Simulator/3.1.3/Applicati