FMDB大量写入数据使用注意点
关于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、引入的它叫做“事务”,事务主要是解决数据量多的耗时操作。
事务和程序是两个概念。一般地讲,一个程序中包含多个事务。
事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由 DBMS 按缺省规定自动划分
在 SQL 语言中,定义事务的语句有三条:
BEGIN TRANSACTION [trænˈzækʃn]
COMMIT TRANSACTION
ROLLBACK [ˈroʊlbæk] TRANSACTION
2、事务我们这样介绍概念,那它的优点又有那些呢?
数据库以文件的形式存在磁盘中,每次访问时都要打开一次文件,如果对数据库进行大量的操作,就很慢。当用事物的形式提交,开始事务后,进行的大量操作语句都 保存在内存中,当提交时才全部写入数据库,此时,数据库文件也只用打开一次。如果操作错误,还可以回滚事务。
Consistency [kənˈsɪstənsi](一致性)只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。
Lsolation(隔离性)事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。
Durability [ˌdjʊərəˈbɪləti] durable
(持久性)事务结束后,事务处理的结果必须能够得到固化。事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库。
所以事务是线程安全的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | /** 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写入大量数据的处理方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话