在之前的篇章 iOS之藍(lán)牙4.0 BLE相關(guān) 中已經(jīng)講到了藍(lán)牙的基本工作原理和獲取數(shù)據(jù),今天的篇章中將著重進(jìn)行實(shí)際開發(fā)中在測(cè)試時(shí)對(duì)獲取的數(shù)據(jù)進(jìn)行存儲(chǔ)
我這里對(duì)數(shù)據(jù)存儲(chǔ)方式為用的是SQLite
在正式編寫數(shù)據(jù)庫(kù)的代碼前,首先仍然是對(duì)數(shù)據(jù)庫(kù)和藍(lán)牙等的一些準(zhǔn)備工作
一 : 數(shù)據(jù)庫(kù)導(dǎo)入
-
創(chuàng)建一個(gè)控制器,我這里就取名稱為CJCenterManagerVC,并包含頭文件
#import <CoreBluetooth/CoreBluetooth.h>
-
遵守協(xié)議:
@interface CJCenterManagerVC() <CBCentralManagerDelegate, CBPeripheralDelegate>
3.配置數(shù)據(jù)庫(kù),libsqlite3.tdb框架,具體位置如下:
4.導(dǎo)入頭文件#import <sqlite3.h>
5.控制器.m文件下對(duì)中心管理者和數(shù)據(jù)庫(kù)等的初始化
@interface CJCenterManagerVC () <CBCentralManagerDelegate, CBPeripheralDelegate>
/** 中心管理者 */
@property (nonatomic, strong) CBCentralManager *cMgr;
/** 連接到的外設(shè) */
@property (nonatomic, strong) CBPeripheral *peripheral;
@property (nonatomic, assign) sqlite3 *db;
@end
二 : 獲取數(shù)據(jù)的代碼部分
由于在之前的這篇 iOS之藍(lán)牙4.0 BLE相關(guān) 中已經(jīng)講解到數(shù)據(jù)的獲取,所以這里不再詳細(xì)講述, 我們這里直接進(jìn)行數(shù)據(jù)庫(kù)和獲取數(shù)據(jù)的代碼的講解
-
1: 數(shù)據(jù)庫(kù)的具體搭建:
我在開發(fā)中是在發(fā)現(xiàn)外設(shè)后調(diào)用的方法中進(jìn)行數(shù)據(jù)庫(kù)的搭建,這個(gè)方法是藍(lán)牙初始化的開始時(shí)搜索外設(shè)后調(diào)用的方法,初步數(shù)據(jù)庫(kù)的搭建請(qǐng)看注釋和下面的注解,詳細(xì)了解數(shù)據(jù)庫(kù)請(qǐng)自行學(xué)習(xí)SQLite,首先先上代碼:// 發(fā)現(xiàn)外設(shè)后調(diào)用的方法 - (void)centralManager:(CBCentralManager *)central // 中心管理者 didDiscoverPeripheral:(CBPeripheral *)peripheral // 外設(shè) advertisementData:(NSDictionary *)advertisementData // 外設(shè)攜帶的數(shù)據(jù) RSSI:(NSNumber *)RSSI // 外設(shè)發(fā)出的藍(lán)牙信號(hào)強(qiáng)度 { // 在此處對(duì)我們的 advertisementData(外設(shè)攜帶的廣播數(shù)據(jù)) 進(jìn)行一些處理 if ([peripheral.name isEqualToString:@"iTAG"] || [peripheral.name isEqualToString:@"ITAG"]) { // 0.獲取沙盒地址 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *sqlFilePath = [path stringByAppendingPathComponent:@"DataBank.sqlite"]; NSLog(@"%@",sqlFilePath); // 1.打開數(shù)據(jù) // sqlite3 *db; // 一個(gè)db就代表一個(gè)數(shù)據(jù)庫(kù) // open會(huì)先判斷數(shù)據(jù)庫(kù)文件是否存在, 如果不存在會(huì)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)文件, 然后再打開數(shù)據(jù) // open會(huì)返回一個(gè)int類型的值, 這個(gè)值代表著打開數(shù)據(jù)庫(kù)是否成功 int result = sqlite3_open(sqlFilePath.UTF8String, &_db); if (SQLITE_OK == result) { NSLog(@"數(shù)據(jù)庫(kù)打開成功"); // 2.創(chuàng)建表 const char *sql = "CREATE TABLE IF NOT EXISTS t_DataBank (id INTEGER PRIMARY KEY AUTOINCREMENT, time text, RSSI REAL DEFAULT 1);"; /* 第1參數(shù):需要執(zhí)行sql語(yǔ)句的數(shù)據(jù)庫(kù) 第2參數(shù):需要執(zhí)行的sql語(yǔ)句 第3參數(shù):執(zhí)行完sql語(yǔ)句之后的回調(diào)方法 第4參數(shù):回調(diào)方法的參數(shù) 第5參數(shù):錯(cuò)誤信息 */ sqlite3_exec(_db, sql, NULL, NULL, &error); if (error) { NSLog(@"創(chuàng)建表失敗"); }else { NSLog(@"創(chuàng)建表成功"); } } else { NSLog(@"數(shù)據(jù)庫(kù)打開失敗"); } // 標(biāo)記我們的外設(shè),讓他的生命周期 = vc self.peripheral = peripheral; // 發(fā)現(xiàn)完之后就是進(jìn)行連接 [self.cMgr connectPeripheral:self.peripheral options:nil]; } }
注解 : SQLite是C語(yǔ)言庫(kù),所以這里傳入的數(shù)據(jù)的沙盒地址必須為C語(yǔ)言字符串,并且在第2步中創(chuàng)建的表是將來(lái)保存數(shù)據(jù)所用
一個(gè)數(shù)據(jù)庫(kù)中可以有多個(gè)表,例如代碼中的表名稱為t_DataBank, 表中有三個(gè)數(shù)據(jù): id:自增長(zhǎng),不用我們插入數(shù)據(jù), time: text格式. RSSI值. 其余兩個(gè)數(shù)據(jù)時(shí)需要我們往里面插入數(shù)據(jù)的
-
2:當(dāng)數(shù)據(jù)庫(kù)搭建完成后,我們就開始進(jìn)行獲取數(shù)據(jù)并往表中插入我們想要保存的數(shù)據(jù),例如RSSI的值
在之前的篇章中我們講過(guò),在如下的方法中可以獲取RSSI的值//讀取到信號(hào)回調(diào) -(void)peripheral:(CBPeripheral *)peripheral didReadRSSI:(NSNumber *)RSSI error:(NSError *)error { NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_DataBank( RSSI) VALUES ( %@);", RSSI]; sqlite3_exec(_db, sql.UTF8String, NULL, NULL, NULL); }
通過(guò)上面的代碼就可以將獲取到的RSSI的值插入到之前創(chuàng)建的t_DataBank表格中, 這樣由于這個(gè)方法會(huì)調(diào)用多次,所以插入的數(shù)據(jù)也是多個(gè),在測(cè)試中就可以對(duì)這些數(shù)據(jù)新型判斷整理
三 : 獲取數(shù)據(jù)庫(kù)后的一些問(wèn)題
1.首先是當(dāng)你的程序運(yùn)行到模擬器上時(shí),因?yàn)槲募潜4娴诫娔X上的,所以我們通過(guò)打印沙盒地址的方法可以拿到我們創(chuàng)建好的DataBank.sql數(shù)據(jù)庫(kù), 但是如果我們?cè)谡鏅C(jī)測(cè)試時(shí),會(huì)發(fā)現(xiàn)這個(gè)打印的地址是我們手機(jī)中的地址,此時(shí)我們并沒(méi)有通過(guò)代碼的方式直接查找到數(shù)據(jù)庫(kù)的方法
這里我給大家說(shuō)下我的辦法,也許您有更好的辦法,歡迎您留言討論
我是下載了一個(gè)軟件, 這個(gè)軟件安裝在電腦上后可以打開與電腦相連的真機(jī),里面的您手機(jī)的APP都可以查看的到,在您的項(xiàng)目下的Document文件夾下可以找到您創(chuàng)建的數(shù)據(jù)庫(kù),這樣的軟件一般網(wǎng)上很多,您可以自行查找2.在找到數(shù)據(jù)庫(kù)后,我們一般還會(huì)面臨一個(gè)問(wèn)題,就是怎樣打開.sql的數(shù)據(jù)庫(kù)文件,我也同樣是下載了一個(gè)軟件,網(wǎng)上一般這種程序也很多, 您同樣也可以自行下載, 一般這樣的軟件支持將您獲取的N多數(shù)據(jù)導(dǎo)出為不同格式到您的電腦中,這其中包括excel表格,然后您可以將表格的數(shù)據(jù)繪制成折線圖,這樣可以更為直觀的查看數(shù)據(jù)
藍(lán)牙的數(shù)據(jù)存儲(chǔ)和測(cè)試就這些,如果有任何問(wèn)題,歡迎留言探討,讓我們一同進(jìn)步!