关于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. something important

    docker run ubuntu /bin/echo 'Hello world' 运行这条命令,docker做了什么 Well, Docker containers only run as long ...

  2. 初步认识Express框架渲染视图

    给出一个简单的例子,讲述模板渲染的基础功能 在nodejs中使用express框架,默认的是ejs和jade渲染模板,以下是以ejs模板进行解析 1.ejs 模板安装 npm install ejs ...

  3. 关于数组的初始化memset函数

    关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.

  4. PyCharm 常用快捷键和设置

    pycharm常用快捷键 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt + Space  快速导入任意类Ctrl + Shift + ...

  5. Linux-shell 练习题(一)

    1.实现批量添加20个用户,用户名为user1-20,密码为user+123 #!/bin/bash count=$ if [ -n "$count" ] then ;i<= ...

  6. Linux下几种RTP协议实现的比较和JRTPLIB编程讲解

    流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议. IP电话等应用场合的技术基础.RTP是进行实时流媒体传输的标准协议和关 ...

  7. ACM学习历程—Rotate(HDU 2014 Anshan网赛)(几何)

    Problem Description Noting is more interesting than rotation! Your little sister likes to rotate thi ...

  8. 【Python】正则表达式中使用变量

    我们有时想把变量放进正则表达式中来匹配想要的结果.Python中使用 re.compile(r''+变量+''),其中正则表达式中的“变量”应为字符串形式. import re regex_test_ ...

  9. 发布django 程序

    1.配置需求环境 pip freeze > requirements.txt 在开发环境将工程依赖的包导出. pip install virtualenv pip install virtual ...

  10. oracle 12c 列式存储 ( In Memory 理论)

    随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...