关于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
        COMMIT TRANSACTION
        ROLLBACK TRANSACTION

      2、事件我们如许引见观点,那它的长处又有那些呢?

           数据库中的插进去操纵是对照耗时的,如果我们一次性在主线插进去几百几千条数据,因为对照较慢就会形成主线程壅塞。那末这时刻可以或许开启一个事物来举行操纵。
       数据库以文件的情势存在磁盘中,每次接见时都要翻开一次文件,若是对数据库举行大批的操纵,就很慢。当用事物的情势提交,最先事件后,举行的大批操纵语句都   生存在内存中,当提交时才悉数写入数据库,此时,数据库文件也只用翻开一次。若是操纵毛病,还可以或许回滚事件。         3、事件的特征            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写入大批数据的处置惩罚要领

 

Last modification:March 25, 2020
如果觉得我的文章对你有用,请随意赞赏