FMDB 使用注意点

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

 

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

      咱们在开发的过程当中确定有使用到真机测试,不知道会不会有小伙伴有好奇心想看看在真机环境中咱们建立的数据库可视化的数据是什么样子呢。固然你能够经过SQ语句去查看,固然咱们也有办法直接像看表格数据同样查看它。浏览器

      一、XCode  -  Window  -  Devices and Simlators安全

      二、选中你的手机  -  选中你的App  -  下面设置按钮 (以下图所示)并发

      三、Download Container...app

      

      四、最好保存桌面,方便咱们查看学习

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

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

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

      固然还有网上不少人说的 火狐浏览器的 SQLite Manager 这个扩展,但因为个人火狐浏览器比较新,就没办法像之前那样可视化的查看了,你如今安装扩展以后是下面这样子的。关于它如今的简单的使用我有标注出来,如今用它查看没无法直接可视化的,但你能够经过下面SQ语句操做该数据库。

 

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

   

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

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

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

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

        BEGIN TRANSACTION
        COMMIT TRANSACTION
        ROLLBACK TRANSACTION

      二、事务咱们这样介绍概念,那它的优势又有那些呢?

           数据库中的插入操做是比较耗时的,假如咱们一次性在主线插入几百几千条数据,因为比较较慢就会形成主线程阻塞。那么这时候能够开启一个事物来进行操做。
       数据库以文件的形式存在磁盘中,每次访问时都要打开一次文件,若是对数据库进行大量的操做,就很慢。当用事物的形式提交,开始事务后,进行的大量操做语句都   保存在内存中,当提交时才所有写入数据库,此时,数据库文件也只用打开一次。若是操做错误,还能够回滚事务。
 
      三、事务的特性
           Atomic(原子性)事务中包含的操做被看作一个逻辑单元,这个逻辑单元中的操做要么所有成功,要么所有失败。事务中的全部元素做为一个总体提交或回滚,事务的个元素是不可分的,事务是一个完整操做。
       Consistency(一致性)只有合法的数据能够被写入数据库,不然事务应该将其回滚到最初状态。事物完成时,数据必须是一致的,也就是说,和事物开始以前,数据存储中的数据处于一致状态。保证数据的无损。
       Lsolation(隔离性)事务容许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其余并行事务的修改相互独立。对数据进行修改的多个事务是彼此隔离的。这代表事务必须是独立的,不该该以任何方式以来于或影响其余事务。
       Durability(持久性)事务结束后,事务处理的结果必须可以获得固化。事务完成以后,它对于系统的影响是永久的,该修改即便出现系统故障也将一直保留,真实的修改了数据库。

      因此事务是线程安全的
 
      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写入大量数据的处理方法

相关文章
相关标签/搜索