热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发——FMDB的使用

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

今天决定给手上的项目加上一个数据库,用来进行数据持久化操作,关于在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
@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的多线程操作。


推荐阅读
author-avatar
英雄醉酒惜红颜_527
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有