关于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 语言中,定义事务的语句有三条:
        BEGIN TRANSACTION
        COMMIT TRANSACTION
        ROLLBACK TRANSACTION
2、事务我们这样介绍概念,那它的优点又有那些呢?
/**
 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写入大量数据的处理方法
原文:https://www.cnblogs.com/zhangxiaoxu/p/10862054.html