iOS开发——FMDB的使用

2016/10/21 iOS开发

今天决定给手上的项目加上一个数据库,用来进行数据持久化操作,关于在iOS端的数据持久化方式的差异,这里也就不再赘述,相信如果真实使用并且去感受过的人,有自己的评判标准。

在比较了RealmSQLite之后,我决定在项目中依然使用SQLite数据库,并切还是使用FMDB这个第三方库来简化操作。(Realm我是觉得体积庞大,至于CoreData问我为什么不用,小心我打人哦)。

SQLite语句,从我自身来说,感觉其实没有那么好的记忆力,所以我又花了一点点时间来温习FMDB的常规操作,想到自己从来没有总结过数据库这方面的知识,今天就花一点点时间,对iOS端SQLite数据库做一点操作层面的总结。

SQLite数据库,其实并不难学,打败许多初学者的,我觉得应该是它C语言中繁琐的API。我之前说我记不住,这套API,我真的看几次忘几次。所以才有了应运而生的FMDB

建表以及关闭表

使用数据库的第一件事,就是建立一个数据库。要注意的是,在iOS环境下,只有document directory 是可以进行读写的。在写程序时用的那个Resource资料夹底下的东西都是read-only。因此,建立的资料库要放在document 资料夹下。方法如下:

    //建表
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSLog(@"doc = %@", doc);
    NSString *fileName = [doc stringByAppendingPathComponent:@"device.sqlite"];
    FMDatabase *db = [FMDatabase databaseWithPath:fileName];
    if ([db open]) {
        BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS Device (deviceID text, deviceName text, deviceType integer, deviceStatus integer);"];
        if (result) {
            NSLog(@"创建表成功");
        } else {
            NSLog(@"建表失败");
        }
    }
    

这样简单的操作就已经完成了数据库的创建,每一行代码都很好理解,先是找到程序在沙盒中的路径,之后填写数据库的名字,完成创建。如果创建数据库成功,那么我们就创建一个名字叫Device的表,这个设备表里有 deviceID, deviceName, deviceType, deviceStatus 四个字段,他们的类型分别是text、text、integer、integer

关于CURD

插入数据

首先,我们对我们的DeviceModel的模型文件声明属性,


#import <Foundation/Foundation.h>

@interface DeviceModel : NSObject

@property (nonatomic, copy) NSString *deviceName;

@property (nonatomic, copy) NSString *deviceID;

@property (nonatomic, assign) NSInteger deviceType;

@property (nonatomic, assign) NSInteger deviceStatus;

- (instancetype)initWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus;

+ (instancetype)DeviceWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus;

@end

.m文件中写好它的初始化方法


#import "DeviceModel.h"

@implementation DeviceModel

- (instancetype)initWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus {
    
    self = [super init];
    
    if (self) {
        _deviceName = deviceName;
        _deviceID = deviceID;
        _deviceType = deviceType;
        _deviceStatus = deviceStatus;
    }
    return self;
}

+ (instancetype)DeviceWithDeviceName:(NSString *)deviceName DeviceID:(NSString *)deviceID DeviceType:(NSInteger)deviceType DeviceStatus:(NSInteger)deviceStatus {
    
    DeviceModel *model = [[DeviceModel alloc] initWithDeviceName:deviceName DeviceID:deviceID DeviceType:deviceType DeviceStatus:deviceStatus];
    return model;
    
}

@end

接下来是插入数据了

插入数据跟前面一样,用executeUpdate后面加语法就可以了。比较不同的是,因为插入的数据会跟Objective-C的变数有关,所以在string里使用?号来代表这些变数。


    DeviceModel *model = [[DeviceModel alloc] initWithDeviceName:@"控制主机" DeviceID:@"0001" DeviceType:1 DeviceStatus:0];
    [db executeUpdateWithFormat:@"INSERT INTO Device (deviceID, deviceName, deviceType, deviceStatus) VALUES (%@, %@, %ld, %ld);",model.deviceID, model.deviceName, model.deviceType, model.deviceStatus];

删除更新数据

//删除更新数据
    NSString *device1 = @"0001";
    [db executeUpdateWithFormat:@"delete from Device where deviceID = %@;", device1];
    [db executeUpdateWithFormat:@"update Device set deviceStatus = %d where deviceID = %@", 1, device1];
    

查询数据

//查询数据
    FMResultSet *resultSet = [db executeQuery:@"select * from Device"];
    while ([resultSet next]) {
        int type = [resultSet intForColumn:@"deviceType"];
        int status = [resultSet intForColumn:@"deviceStatus"];
        NSString *name = [resultSet objectForColumnName:@"deviceName"];
        NSString *id = [resultSet objectForColumnName:@"deviceID"];
        NSLog(@"type = %d , status = %d, name = %@, id = %@", type, status, name, id);
        } 

至此,FMDB的常用操作就已经讲完了,后面还会补上FMDB的多线程操作。

Search

    Table of Contents