数据持久化(三)使用第三方类库FMDB

@SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3。在IOS中使用SQLite如果使用SDK提供的方法,特别麻烦也不利于理解和使用,感觉使用很不方便,今天就讲讲一个针对IOS的SQlite API封装的第三方库FMDB,FMDB对SDK中的API做了一层封装,使之使用OC来访问,使用方便而且更熟悉。FMDB的下载地址https://github.com/ccgus/fmdb


@FMDB主要涉及两个类,FMDatabase和FMResultSet下载完FMDB源码后把文件拖到工程中,并导入SQLite支持 库,libsqlite3.0.dylib


#import "HMTDataBaseHandle.h"
#import "FMDB.h"
#import "HMTPerson.h"


@implementation HMTDataBaseHandle

static HMTDataBaseHandle * _dbHandle = nil;
+ (HMTDataBaseHandle *)shareInstance{

    @synchronized(self){
    
        if (!_dbHandle) {
            
            _dbHandle = [[HMTDataBaseHandle alloc]init];
            
            [_dbHandle openDataBase];
            
            [_dbHandle createTable];
        }
    }
    
    return _dbHandle;
}

#pragma mark - 定义一个 FMDatabase 对象
static FMDatabase * database = nil;

#pragma mark - 获得沙盒文件下Documents路径
- (NSString *)getDocumentsPath{

    NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];

    return documents;
}

#pragma mark - 打开数据库操作------ databaseWithPath   open
- (void)openDataBase{

    if (database) {
        return;
    }
    
    NSString * DataBasePath = [[self getDocumentsPath] stringByAppendingPathComponent:@"test.sqlite"];
    
    database = [FMDatabase databaseWithPath:DataBasePath];
    if (![database open]) {
        
        NSLog(@"打开数据库失败");
    }
    
    // 为数据库设置缓存,提高查询效率
    database.shouldCacheStatements = YES;
    
    NSLog(@"打开数据库成功");
}

#pragma mark - 关闭数据库操作
- (void)closeDataBase{

    if (![database close]) {
        NSLog(@"关闭数据库失败");
        return;
    }
    
    database = nil;
    NSLog(@"关闭数据库成功");

}

#pragma mark - 管理创建表的操作
- (void)createTable{

    [self openDataBase];

    // 判断表是否存在,不存在就创建------ tableExists
    if (![database tableExists:@"Person"]) {
        
        [database executeUpdate:@"CREATE TABLE Person(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)"];
        
        NSLog(@"创建表成功");
    }
    
    [self closeDataBase];
}


#pragma mark - 增加数据操作----- executeUpdate
- (void)insertIntoDataBase:(HMTPerson *)person{

    [self openDataBase];
    
    [database executeUpdate:@" INSERT INTO Person (id,name,age) VALUES (?,?,?)",[NSString stringWithFormat:@"%i",person.personId],person.personName,person.personAge]];

    [self closeDataBase];
}

#pragma mark - 删除数据操作----- executeUpdate
- (void)deleteDataFromDataBase:(HMTPerson *)person{

    [self openDataBase];

    [database executeUpdate:@" DELETE FROM Person WHERE id = ?",person.personId]];
    
    [self closeDataBase];
}

#pragma mark - 更新数据操作----- executeUpdate
- (void)updateFromDataBase:(HMTPerson *)person{

    [self openDataBase];
    
    [database executeUpdate:@" UPDATE Person SET name = ? WHERE id = ?",person.personId]];

    [self closeDataBase];
}

#pragma mark - 查询数据操作(与其他的都不一样,查询是调用executeQuery,切记切记!!!!!!)
- (void)selectAllDataFromDataBase{

    [self openDataBase];

    FMResultSet * resultSet = [database executeQuery:@" SELECT * FROM Person"];
    while ([resultSet next]) {
        
        int Id = [resultSet intForColumn:@"id"];
        NSString * name = [resultSet stringForColumn:@"name"];
        int age = [resultSet intForColumn:@"age"];
        
        NSLog(@"personId:%i,personName:%@,personAge:%i",Id,age);
    }
    
    [self closeDataBase];
}


@end

@FMDB提供如下多个方法来获取不同类型的数据:

1.intForColumn:
2.longForColumn:
3.longLongIntForColumn:
4.boolForColumn:
5.doubleForColumn:
6.stringForColumn:
7.dateForColumn:
8.dataForColumn:
9.dataNoCopyForColumn:
10.UTF8StringForColumnIndex:
11.objectForColumn:




@如果我们的app需要多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。切记不能在多个线程中共同一个FMDatabase对象并且在多个线程中同时使用,这个类本身不是线程安全的,这样使用会造成数据混乱等问题。

使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。在闭包中操作数据库,而不直接参与FMDatabase的管理。

  1. -(void)executeDBOperation
  2. {
  3. //获取Document文件夹下的数据库文件,没有则创建
  4. NSString*docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,YES)objectAtIndex:0];
  5. NSString*dbPath=[docPathstringByAppendingPathComponent:@"user.db"];
  6. FMDatabaseQueue*databaseQueue=[FMDatabaseQueuedatabaseQueueWithPath:dbPath];
  7. [databaseQueueinDatabase:^(FMDatabase*db){
  8. [dbexecuteUpdate:@"insertintouservalues(?,?)",@"Ren",@"Male",[NSNumbernumberWithInt:20]];
  9. }];
  10. [databaseQueueclose];
  11. }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="