关于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. Pyton基础-base64加解密

    base64加密后是可逆的,所以url中传输参数一般用base64加密 import base64 s='username=lanxia&username2=zdd' new_s=base64 ...

  2. java 任务调度实现的总结

    Timer Timer的核心是Timer和TimerTask,Timer负责设定TimerTask的起始与间隔执行时间,使用者需要建立一个timeTask的继承类,实现run方法,然后将其交给Time ...

  3. codeforces 598E E. Chocolate Bar(区间dp)

    题目链接: E. Chocolate Bar time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. OpenCV-Python sift/surf特征匹配与显示

    import cv2 import numpy as np def drawMatchesKnn_cv2(img1_gray,kp1,img2_gray,kp2,goodMatch): h1, w1 ...

  5. 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树和一个和,判断这个树 ...

  6. 常用调试工具gdb,dbx,valgrind介绍一

    类UNIX下C/C++开发,代码调试比较麻烦,最原始的加跟踪调试很土,也很费时,特别是一个庞大的项目,代码行数非常大的时候调试起来非常费劲,当core dump时定位也不容易,这里介绍几个常用工具: ...

  7. 1045 Favorite Color Stripe (30)(30 分)

    Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...

  8. ACM学习历程——ZOJ 3822 Domination (2014牡丹江区域赛 D题)(概率,数学递推)

    Description Edward is the headmaster of Marjar University. He is enthusiastic about chess and often ...

  9. 问题4:对dict、list、tuple中的元素排序

    一)对字典中元素排序   方法一:利用sorted的key参数进行排序 from random import randint date = {k:randint(0, 20) for k in ran ...

  10. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...