今天决定给手上的项目加上一个数据库,用来进行数据持久化操作,关于在iOS端的数据持久化方式的差异,这里也就不再赘述,相信如果真实使用并且去感受过的人,有自己的评判标准。
在比较了Realm
、SQLite
之后,我决定在项目中依然使用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的多线程操作。