SQLite3的面向对象封装FMDB

  • FMDB简介

什么是FMDB?

FMDB是iOS平台的SQLite数据库框架

FMDB以OC的方式封装了SQLite的C语言API

FMDB的优点?

使用起来更加面向对象,省去了很多麻烦、冗余的代码

对比苹果自带的CoreData框架,更加轻量级和灵活

提供了多线程安全的数据库操作方法,有效地方志数据混乱。

FMDB的github托管地址:https://github.com/ccgus/fmdb

  • FMDatabase对象

FMDatebase对象:代表一个独立的SQLite数据库

数据库的打开/创建:

FMDatebase *db = [FMDatabase databaseWithPath:path];
if ( ![db open] ) {
    NSLog(@"数据库打开失败!");
}

文件路径的三种情况说明:

a. 具体的文件名:如果不存在会创建

b. 空字符串@”” :临时目录创建一个空的,当FMDatabase连接关闭时删除

c. 会在内存中创建一个临时数据库,当FMDatabase连接关闭时删除

数据库关闭

- (BOOL)close
  • FMDatabaseQueue对象

FMDatabase这个类是线程不安全的,如果在多个线程中同时使用一个FMDatabase实例,可能会造成数据混乱的问题。

为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类。

FMDatabaseQueue对象的创建 :

+ (instancetype)databaseQueueWithPath:(NSString *)aPath

FMDatabase对象封装在其中,并且创建的同时打开。

关闭:

- (void)close

简单来说,FMDatabaseQueue将FMDatabase进行了封装,推荐使用FMDatabaseQueue

如:

- (void) setupFMDB
{
    NSString * path = [NSString stringWithFormat:@"%@/Documents/h.sqlite", NSHomeDirectory()];
    self.queue = [FMDatabaseQueue databaseQueueWithPath:path];
}

FMDatabaseQueue并不是FMDatabase,并没有直接执行SQL语句的方法

使用 inDatabase方法通过block的方式,将执行SQL语句的代码传入

- (void)inDatabase:(void ( ^ ) ( FMDatabase *db ))block

block的参数db即封装在FMDatabaseQueue内部的FMDatabase对象

  • FMDatabase执行更新语句

在FMDB中,除查询外的所有操作,都是“更新” ,如:create drop insert delete update

使用executeUpdate:方法执行更新 ,该方法传递一个SQL语句字符串,并可以指定格式参数

- (BOOL)executeUpdate:(NSString *)sql, ...
- (BOOL)executeUpdate:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
- (BOOL)executeUpdate:(NSString *)sql withErrorAndBindings:(NSError **)outErr, ...
- (BOOL)executeUpdate:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments
- (BOOL)executeUpdate:(NSString *)sql withVAList:(va_list)args
- (BOOL)executeUpdateWithFormat:(NSString *)format, ...

这是一族函数,具有相同的功能,选择一个你习惯的调用方式

如:

- (void) updateDesc:(NSString*) desc forID:(NSString*) ID
{
    [self.queue inDatabase:^(FMDatabase *db) {
        if ( ![db executeUpdate:@"update t_hero set desc=? where id=?", desc, ID] ) {
            NSLog(@"%@", [db lastErrorMessage]);
        }
    }];
}
  • 执行查询语句

执行一个查询语句,使用方法 execteQuery: ,该方法传递一个查询SQL语句,并可以指定占位参数,返回一个查询的结果集对象

- (FMResultSet *)executeQuery:(NSString *)sql, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments
- (FMResultSet *)executeQueryWithFormat:(NSString *)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withVAList:(va_list)args

FMResultSet对象是结果集对象,其内部是链表结构,通过next来遍历每一行结果

既可以通过列的下标过得字段值,也可以通过字段名获得字段值

如:

- (NSString*) getDescWithID:(NSString*) ID
{
    __block NSString *pret = nil;
    [self.queue inDatabase:^(FMDatabase *db) {
        FMResultSet * rs = [db executeQuery:@"select desc from t_hero where id=?;", ID];
        if ( [rs next] ) {
            pret = [rs stringForColumn:@"desc"];
        }
        [rs close];
    }];
    return pret;
}
  • 事务处理

什么是事务?

也称工作单元,是一个或多个SQL语句组成的序列,作为一个完整的工作单元

如:A到银行为B转账1000元

操作1:A账户 - 1000

操作2:B账户 + 1000

两个操作放在一起构成一个完成的工作单元。

为什么要进行事务处理?

如果操作1成功,但操作2失败了,则会出现***烦

将两个操作放在一个事务中进行处理,保证同时成功或同时失败

事务的sql语句:

开始事务begin transaction

提交事务commit transaction

回滚事务rollback transaction

FMDB的事务处理,如:

[self.queue inTransaction:^(void *db, BOOL * rollback) {
    FMResultSet * rs = [db executeQuery:@"select * from t_hero;"];
    while ( [rs next] ) {
        //...
    }
    if ( ![db executeUpdate:@"insert into t_table(name) values(:)", @"Rose"] ) {
        *rollback = YES;
    }
}];
时间: 2024-11-05 11:23:19

SQLite3的面向对象封装FMDB的相关文章

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

OC面向对象封装

OC面向对象封装 一.面向对象和封装 面向对象的三大特性:封装(成员变量),继承,多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴露在外面的时钟表面,像外界提供展示以及接口,@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来. 二.Set方法 在研发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public,@protected等关键字修饰,而是使用Set方法来为对象提供成员变量值,

面向对象 封装 、继承

构造函数: 构造函数 - 创建一个类的函数 每一个类都有构造函数,访问修饰符必须是public的,并且不需要写任何返回值,方法名与类名一致 自己写的类 - 用户自定义类型如果要使用自定义类型产生出来的  对象  必须有一个实例化的过程 实例化格式:类型名  ss = new 构造函数(); 访问修饰符 -  4个 public - 公共的,任何地方都可以访问,但是需要引用 命名空间 private - 私有的,类的内部才可以访问 internal - 内部的,默认的,程序集中可以访问,程序集就是

Java面向对象㈠ -- 封装

Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:private,默认,protected,public来实现.(这四个权限访问控制符的区别网上有很多,建议读者自行搜索学习,切记要亲自练习一下!)最明显的实现就是把类的成员变量私有(private),只能通过类的成员函数来进行访问,并且此时的成员函数公有(public).这就是著名的setter/getter

Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔术方法 预定义方法2 1.3. 魔术常量(Magic constants) 预定义变量2 1.4. 适用领域 js php java c#2 1.5. 构造函数 __construct( ) vs xxxCls()3 1.6. 析构函数名称必须是__destruct( )  finally()3 1.7. 私有属性 与工友属性3 1.8. $this指针3 1.9. __autoload() 类自动

ios sqlite3数据库的封装-自己封装的,针对锁死database is closed的解决和预防

在数据库创建时应判断数据是否存在(不为空nil) if(sqlite==nil){// 判断数据库是否存在,若存在就不创建,若不存在才创建,以防数据库锁死 if (SQLITE_OK == sqlite3_open(dpPath.UTF8String , &sqlite)) { NSLog(@"数据库创建成功"); }else{ NSLog(@"数据库创建失败"); } } #import "SqlManager.h" #import &

使用java中,面向对象封装+继承的方法算题

1.第一种:给定一行字符,逆序输出此字符串(空格.数字不输出),如"ab 23,(4 cd"输出"dc(,ba".(要求:使用面向对象封装+继承) class Bu { private String str; public Bu(){} public Bu(String str){ this.str = str; } public String getStr(){ return str; } public void setStr(String str){ this.

面向对象封装的web服务器

import socket import re import os import sys # 由于前面太繁琐,可以用类封装一下,也可以分几个模块 class HttpServer(object): def __init__(self,port): # 1.服务器创建负责监听的socket self.socket_watch = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2.设置地址重用 self.socket_watch.setsoc

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关E