關於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
COMMIT TRANSACTION
ROLLBACK TRANSACTION
2、事務我們這樣介紹概念,那它的優點又有那些呢?
資料庫以檔案的形式存在磁碟中,每次訪問時都要開啟一次檔案,如果對資料庫進行大量的操作,就很慢。當用事物的形式提交,開始事務後,進行的大量操作語句都 儲存在記憶體中,當提交時才全部寫入資料庫,此時,資料庫檔案也只用開啟一次。如果操作錯誤,還可以回滾事務。
Consistency(一致性)只有合法的資料可以被寫入資料庫,否則事務應該將其回滾到最初狀態。事物完成時,資料必須是一致的,也就是說,和事物開始之前,資料儲存中的資料處於一致狀態。保證資料的無損。
Lsolation(隔離性)事務允許多個使用者對同一個資料進行併發訪問,而不破壞資料的正確性和完整性。同時,並行事務的修改必須與其他並行事務的修改相互獨立。對資料進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來於或影響其他事務。
Durability(永續性)事務結束後,事務處理的結果必須能夠得到固化。事務完成之後,它對於系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了資料庫。
所以事務是執行緒安全的
/** 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寫入大量資料的處理方法