关于FMDB最基本的使用我们就不在说了,这个网上大把的文章介绍,我就在这里总结几点我最近在写一个小东西的时候注意到的一点点东西:

一: 怎么看真机上SQLite数据库

我们在开发的过程中肯定有使用到真机测试,不知道会不会有小伙伴有好奇心想看看在真机环境中我们创建的数据库可视化的数据是什么样子呢。当然你可以通过SQ语句去查看,当然我们也有办法直接像看表格数据一样查看它。

1、XCode  -  Window  -  Devices and Simlators

2、选中你的手机  -  选中你的App  -  下面设置按钮 (如下图所示)

3、Download Container...

4、最好保存桌面,方便我们查看

然后你桌面就会有一份 .xcappdata 文件了,这时候你再“显示包内容” 就可以看到里面有一份 AppData 和 AppDataInfo.plist 文件,这时候你 AppData - Documents

就能看到你的 X.sqlite 数据库了。

查看这份数据库我使用的是一个叫SQLite的国外软件的破解版,直接可视化看到,大概界面如下面这样:

当然还有网上很多人说的 火狐浏览器的 SQLite Manager 这个扩展,但由于我的火狐浏览器比较新,就没办法像以前那样可视化的查看了,你现在安装扩展之后是下面这样子的。关于它现在的简单的使用我有标注出来,现在用它查看没没法直接可视化的,但你可以通过下面SQ语句操作该数据库。

关于FMDB最基本的使用我们就不在说了,这个网上大把的文章介绍,我就在这里总结几点我最近在写一个小东西的时候注意到的一点点东西:

二:要是你要写入大量的数据

1、引入的它叫做“事务”,事务主要是解决数据量多的耗时操作。

    在数据库操作中,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。
  事务和程序是两个概念。一般地讲,一个程序中包含多个事务。
  事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由 DBMS 按缺省规定自动划分

在 SQL 语言中,定义事务的语句有三条:

        BEGIN TRANSACTION         [trænˈzækʃn]
        COMMIT TRANSACTION
        ROLLBACK  [ˈroʊlbæk]  TRANSACTION

2、事务我们这样介绍概念,那它的优点又有那些呢?

           数据库中的插入操作是比较耗时的,假如我们一次性在主线程插入几百几千条数据,由于比较较慢就会造成主线程阻塞。那么这时候可以开启一个事物来进行操作。
       数据库以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。当用事物的形式提交,开始事务后,进行的大量操作语句都   保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
 
      3、事务的特性
           Atomic  [əˈtɑːmɪk](原子性)事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。
       Consistency [kənˈsɪstənsi](一致性)只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。
       Lsolation(隔离性)事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。
       Durability  [ˌdjʊərəˈbɪləti] durable
(持久性)事务结束后,事务处理的结果必须能够得到固化。事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。
      所以事务是线程安全的
 
      EG:下面就是一个简单的数据存储关于FMDB事务的例子
/**
debug
@param title 统计标题
@param content 统计内容JSON数据
*/
-(void)DebugSensorsAnalyticsShowWithDoraemonKit:(NSString *)title andParments:(NSString * )content{ // 获得Documents目录路径
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"SensorsAnalytics.sqlite"];
debugLog(@"!!! debug !!! dbPath = %@",dbPath);
//创建数据库
_dataBase = [FMDatabase databaseWithPath:dbPath];
if (![_dataBase open]) {
debugLog(@"SensorsAnalytics open fail");
return;
}
//创建表 currenthour 比较时间 一小时前的删除 不然数据过大
NSString * sql = @"create table if not exists sensorsAnalytics ('time' TEXT NOT NULL,'title' TEXT NOT NULL, 'content' TEXT NOT NULL,'hour' TEXT NOT NULL)";
BOOL result = [_dataBase executeUpdate:sql];
if (result) {
debugLog(@"create sensorsAnalytics table success");
} [_dataBase beginTransaction];//开启一个事务
BOOL isRollBack = NO;
@try {
NSString *currentTime = [self getCurrentTimes];
NSString *currenthour = [self getCurrentHour];
BOOL insertResult = [_dataBase executeUpdate:@"insert into 'sensorsAnalytics'(time,title,content,hour) values(?,?,?,?)" withArgumentsInArray:@[currentTime,title,content,currenthour]];
if (insertResult) {
debugLog(@"insert into 'sensorsAnalytics' success");
}
// 把一个小时前的数据删除
BOOL deleteResult = [_dataBase executeUpdate:[NSString stringWithFormat:@"delete from sensorsAnalytics where hour < %@",currenthour]];
if (deleteResult) {
debugLog(@"delete from 'sensorsAnalytics' success");
} } @catch (NSException *exception) {
isRollBack = YES;
[_dataBase rollback]; // 回滚
} @finally {
if (!isRollBack) {
[_dataBase commit]; // 没有错误一次性提交
}
}
[_dataBase close];
} -(NSString*)getCurrentTimes{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM-dd HH:mm:ss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
return currentTimeString;
} -(NSString *)getCurrentHour{ NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now];
NSString * hour = [NSString stringWithFormat:@"%ld",(long)[dateComponent hour]];
return hour;
}

参考学习链接: FMDB写入大量数据的处理方法

FMDB 使用注意点的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  4. IOS FMDB 获取数据库表和表中的数据

    ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...

  5. 简单的数据库设计及使用(FMDB)

    有这样一个需求: 有m个用户公用n个文件,一个用户可能会用到多个文件,一个文件可能被多个用户使用: 如果某个用户离开,那这个用户就不再使用任何文件:如果某个文件没有任何用户使用,就要删除该文件: 已知 ...

  6. FMDB的使用方法

    转自:http://blog.devtang.com/blog/2012/04/22/use-fmdb/ 前言 SQLite (http://www.sqlite.org/docs.html) 是一个 ...

  7. FMDB 排它锁

    -------------------------------------基本操作------------------------------------- #import "ViewCon ...

  8. [ios]关于用FMDB 操作数据库 删除 tableView 后刷新

    刚了解使用fmdb,从数据库获取数据 绑定到一个可变数组classNameItems //从ClassList表取得数据 FMResultSet *classInfo=[db executeQuery ...

  9. IOS数据存储之FMDB数据库

    前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...

  10. FMDB第三方框架

    FMDB是同AFN,SDWebImage同样好用的第三方框架,它以OC的方式封装了SQLite的C语言API,使得开发变得简单方便. 附上github链接https://github.com/ccgu ...

随机推荐

  1. 代码题(1)—lower_bound和upper_bound算法

    1.lower_bound:查找序列中的第一个出现的值大于等于val的位置 这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体 ...

  2. WebElement接口获取值

    通过WebElement接口获取值 size 获取元素的尺寸 text 获取元素的文本 get_attribute(name) 获取属性值 location 获取元素坐标,先找到要获取的元素,再调用该 ...

  3. 不得不存!UI设计新手不可错过的7条实用法则

    http://www.gameres.com/316761.html 本文编译自 Medium,作者是一位UX(User Experience, 用户体验)设计师,他通过自己学习UI设计的过程,总结出 ...

  4. php 冒泡排序原理

    $start = microtime(true);   $popArr = array(6,3,23,1,5,100,399,99,66);   echo '6,3,23,1,5,100,399,99 ...

  5. python-Django监控系统二次开发Nagios

    1.Nagios安装 yum install -y nagios.i686 yum install -y nagios-plugins-all.i686 安装完后会在apache的配置文件目录下/et ...

  6. VScode 为 *.cu文件 添加高亮及c++ intelligence相关操作的方法

    问题:*.cu在VScode不能像*.cc或*.cpp一样在c++及c++ intelligence插件有关键字的高亮以及go to definition等的操作 解决方案:添加*.cu与*.cpp文 ...

  7. 优秀开源项目之一:视频监控系统iSpy

    iSpy是一个开源的视频监控软件,目前已经支持中文.自己用了一下,感觉还是很好用的.翻译了一下它的介绍. iSpy将PC变成一个完整的安全和监控系统 iSpy使用您的摄像头和麦克风来检测和记录声音或运 ...

  8. bzoj 2096 [POI2004]ZAW——二进制枚举

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成  从1点出的一部分  和  走向1点的一部分.多起点最短路就和 ...

  9. docker-建立私有registry

    我们知道可以使用hub.docker.com作为我们公共或者私有的registry.但由于服务器在国外的原因,网速会非常的慢.所以我们在利用docker开发构建容器服务时,我们希望能够建立自己的私有r ...

  10. Java中的String数据类型

    本文主要是说明一些String数据类型的基本知识,有些杂乱,不过都是比较重要的东西,主要是参考了网上人的资料.原文网址:http://dev.yesky.com/91/2309091.shtml 主要 ...