您的当前位置:首页正文

OC_FMDB有'深度'的DEMO

来源:花图问答

最近因为实训中用到数据库,就从想找些资料关于FMDB保存数据的,特别是保存数组、字典、模型等复杂的类型数据,但是网上一搜,全是字符串的一些增加、删除等,难道网上发帖的人都是只会这些的吗?所以很生气就自己研究了一下,写了一个关于保存一些基本类型、数组、字典(有3种方法,这里只介绍一种)、模型和时间的Demo。(很多坑都已经避开,大家工作中,拿来即用……)

一、简单介绍

一)、FMDB框架中重要的框架类

  1. FMDatabase

    FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句

  2. FMResultSet

    使用FMDatabase执行查询后的结果集

  3. FMDatabaseQueue

    用于在多线程中执行多个查询或更新,它是线程安全的

二)、FMDB思维导图

iOS2期思维导图学习

二、使用

一)、封装结构

(考虑到部分人理解起来困难,现给一个简单版本,想封装的酷点,可以参考实训项目给的框架源码)


二)、模块代码

  • DBHeader.h
/** 表名 */
`#define KTable_UserName1 @"KTable_UserName1"

/** 一个存数据库需要的头文件 */
#import "FMDB.h"
#import "DAO.h"
#import "DataBaseManager.h"
  • DataBaseManager.h
@implementation DataBaseManager

//单例
+(instancetype)sharedManager{
    
    static DataBaseManager *manager = nil;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        
        manager = [[DataBaseManager alloc] init];
        
    });
    return manager;
}

- (instancetype)init{

    if (self = [super init]) {
        
        NSString *docDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
        NSString *filePath = [docDir stringByAppendingPathComponent:@"DB1.sqlite"];
        
        NSLog(@"路径 = %@",filePath);
        
        _databaseQueue = [FMDatabaseQueue databaseQueueWithPath:filePath];
    }
    return self;
}

@end
  • DAO.m
- (FMDatabaseQueue *)databaseQueue{
    
    return [DataBaseManager sharedManager].databaseQueue;;
}

+ (void)creatTableIfNeed{
    
    //【注意】:以后做sql语句,()外面的参数用字符串拼,()里面的参数放在执行方法里写
    NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, score REAL,arr BLOB,dic BLOB,book BLOB,img BLOB)",KTable_UserName1];
    
    [[DataBaseManager sharedManager].databaseQueue inTransaction:^(FMDatabase *db, BOOL *rollback) {
        
        if ([db executeUpdate:sql]) {
            
            NSLog(@"创建表成功");
        }
    }];
}

  • UserDAO.h
@interface UserDAO : DAO     //一定要继承DAO,不然self点不出来databaseQueue的

///单例
+(instancetype)sharedInstance;
    
/*!
 *  插入数据
 */
- (BOOL)insertUserDTO:(UserDTO *)dto;

/*!
 *  获取数据
 */
- (NSArray *)loadUserData;

/*!
 *  修改数据
 */
- (BOOL)updateUserDTO:(UserDTO *)dto;

/*!
 *  删除某个模型
 */
- (BOOL)deleteUserDTO:(UserDTO *)dto;

@end

三)、常用sql语句

创建表

CREATE TABLE IF NOT EXISTS "T_Person" (
      "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
      "name" TEXT,
      "age" INTEGER,
      "heigth" REAL
)
//下边是sqllite编译器里边的语句

/*简单约束*/
CREATE TABLE IF NOT EXISTS t_student
(
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT,
      age INTEGER
);

CREATE TABLE IF NOT EXISTS t_student
(
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     name TEXT UNIQUE,
     age INTEGER
);

/*添加主键*/
CREATE TABLE IF NOT EXISTS t_student
(
     id INTEGER PRIMARY KEY AUTOINCREMENT,
     name TEXT,
     age INTEGER,
     score REAL
);

/*添加主键*/
CREATE TABLE IF NOT EXISTS t_student
(
     id INTEGER,
     name TEXT,
     age INTEGER,
     score REAL,
     PRIMARY KEY(id)
);

查询

  /*分页*/
 SELECT * FROM t_student
 ORDER BY id ASC LIMIT 30, 10;

  /*排序*/
 SELECT * FROM t_student
 WHERE score > 50
 ORDER BY age DESC;

 SELECT * FROM t_student
 WHERE score < 50
 ORDER BY age ASC , score DESC;

 /*计量*/
 SELECT COUNT(*)
 FROM t_student
 WHERE age > 50;

 /*别名*/
 SELECT name as myName, age as myAge, score as myScore
 FROM t_student;

 SELECT name myName, age myAge, score myScore
 FROM t_student;

 SELECT s.name myName, s.age myAge, s.score myScore
 FROM t_student s
 WHERE s.age > 50;

 /*查询*/
 SELECT name, age, score FROM t_student;
 SELECT * FROM t_student;

更新

 UPDATE t_student
 SET name = 'MM'
 WHERE age = 10;

 UPDATE t_student
 SET name = 'WW'
 WHERE age is 7;

 UPDATE t_student
 SET name = 'XXOO'
 WHERE age < 20;

 UPDATE t_student
 SET name = 'NNMM'
 WHERE age < 50 and score > 10;

 /*更新记录的name*/
 UPDATE t_student SET name = 'zhangsan';

删除

 DELETE FROM t_student;

 DELETE FROM t_student WHERE age < 50;

插入

INSERT INTO t_student
 (age, score, name)
 VALUES
 ('28', 100, 'zhangsan');

 INSERT INTO t_student
 (name, age)
 VALUES
 ('lisi', '28');

 INSERT INTO t_student
 (score)
 VALUES
 (100);

删除表

/*删除表*/
 DROP TABLE IF EXISTS t_student;

源码链接: