標籤:
本系列博文我想圍繞在Android中的一些最佳化細節和大家進行分享。Android中的最佳化可謂又是一重任,Android不足以像PC端具有很高的記憶體執行空間給我們用來重量級使用開銷。有限的記憶體資源限制了我們的擴充方向。所以,在Android中的記憶體最佳化以及效能最佳化成為了一個攻城獅不可忽略的重點所在。本系列博文關於效能最佳化我會分為一下4個模組來和大家分享:
(1)Android效能最佳化 一 SQLite資料庫
(2)Android效能最佳化 一 布局最佳化
(3)Android效能最佳化 一 資料最佳化
(4)Android效能最佳化 一 網路最佳化
今天我們先一起來瞭解下在Android中的SQLite資料庫操作方面有哪些需要最佳化和注意的地方。
Android中對於SQLite資料庫的操作,系統為我們提供了很方便的實現。我們只需要建立自己的一個類繼承SQLiteOpenHelper類並實現其中的onCreate方法和onUpgrade方法即可。在資料庫最佳化方面,SQLite和其他資料庫例如 Oracle、SQL Server、 My Sql等等,一樣擁有相同的原理,只是SQLite是一種嵌入式的資料庫,在移動端手機中使用比較合適。對於SQLite的最佳化,我們可以分為以下兩類:
1> 索引
2> 事務
關於資料庫建立索引想必大家都比較熟悉。索引給我們帶來的好處是顯而易見的。一個千萬級的資料,索引的存在使查詢資料的速度升華為一個更優的高度。同樣,在查詢速度提升的同時,建立索引所帶來的開銷也是不可忽視的。有利必有弊,所以適當的情況下建立索引,會給我們的資料查詢帶來質的變化。
瞭解了建立索引的優點和缺點,我們看下在Android中的SQLite資料庫建立索引的方式:
從上面代碼我們看到,在onCreate方法中只需要使用SQLiteDatabase執行個體db調用execSQL方法執行建立建立索引的SQL語句即可。索引的使用適合在當某個欄位查詢頻率高,而更新操作頻率低的情況下並且經常有範圍的查詢(>,< >=,<=,=)已經對order by 和group by的操作。對於SQLite建立索引我們先說到這裡,對於索引還不太瞭解的童靴,可以看下這篇文章:SQLite 索引
瞭解完了索引,下面我們繼續探討SQLite的事務。
對於事務,就是資料庫的一次原子性的執行操作。原子性的執行操作為資料的整體性執行帶來的可靠安全性。在SQLite中,如果我們預設事務(會為每個插入和更新都建立一次事務,並且在每次插入和更新後會立刻提交本次操作),即沒有手動建立事務,假設此時有1000條資料,那麼資料的執行流程是 建立事務 -> 執行插入或更新操作 -> 提交事務,這樣的流程會執行1000次。如果我們手動建立了事務,則執行流程為: 建立事務 -> 執行1000條SQL資料操作 -> 提交事務。很明顯,我們在SQLite中使用事務可以為插入和更新操作帶來很大的最佳化。下面來看在SQLite中如何使用事務:
從我們看到,執行一次事務分為了四步,分別是:開始事務 -> 執行SQL ->設定事務執行成功 -> 結束事務
ok,兩個主要的模組我們已經介紹完畢,下面來看下對於SQLite的一些其他的最佳化細節:
1> 少用cursor.getColumnIndex():使用cursor.getColumnIndex(),系統會根據列名來擷取列所在的下標,比較耗時,所以我們可以使用static定義下標,直接通過下標來擷取某列。
2> 使用StringBuilder或StringBuffer來拼接字串:SQL語句字串的拼接或建立多個臨時變數,此時我們可以使用StringBuilder或StringBuffer來拼接字串,減少不必要的資源佔用,這個不多說,大家都懂的。
3> 查詢時,只返回自己需要的值或結果:有些童靴可能為了簡單,在查詢資料時直接將全部資料擷取出來,然後再get到自己想要的某列值。這樣的操作同樣會帶來不必要的系統資源開銷和浪費。所以,在查詢時,我們只取自己需要的欄位和結果。
4>cursor使用後要及時關閉:即在查詢完結果後,調用cursor.close()將資源關閉。
關於Android中SQLite資料庫的最佳化,就和大家分享到這裡,有不妥的地方還望大神多多提醒。下一篇,我將和大家一起分享在Android最佳化系列的第二篇:Android效能最佳化-布局最佳化
Android效能最佳化-SQLite資料庫