热门标签 | 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的多线程操作。


推荐阅读
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • Android和iOS的数据库都是用SQLite来实现.一,SQLite数据库简介:轻量级:SQLite数据库是一个轻量级的数据库,适用于少量数据的CURD;文件本质:SQL ... [详细]
  • Iamcopyingapre-existingdatabasetodatadatapackagenamedatabasesusingcodelearnedfromusi ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • WhenImtryingtorunthefollowing:当我试图运行以下内容时:ContentValuescvnewContentValues();cv ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
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社区 版权所有