Android 上的 SQL Lite 性能

openkk 12年前發布 | 19K 次閱讀 SQL Lite Android開發 移動開發

Android 上的 SQL Lite 性能

也許有人還不知道,Android 是有一些內建的 類庫支持 SQL Lite 數據庫的操作。他提供了一個很好的方式在 Android 上組織少量的數據。不管怎樣,在使用這些類庫的時候有一些陷阱是需要注意的。


根據你所使用的版本不同,一個相同的查詢的運行時間可能從幾毫秒到幾分鐘不等。例如,一個查詢可能在 Galaxy S2 運行少于一秒(在 iPhone 4 上可能更快),但是在 Atrix 2 和 HTC Desire 上運行卻需要一分鐘。所有這些手機都有類似的硬件,那么區別在哪里?

在對代碼研究了幾天后,我發現問題在于查詢語句的設計。當你使用大量的 joins 或者 unions 的時候,問題就出現了。組合一張大的數據表和一張或多張中等大小的數據表,需要非常小心的優化來保證在所有的設備上都有良好的性能。在做 unions 或者 joins 之前限制數據表的大小很重要!

我們以下面的數據庫和數據表為例:
· 一張 Person 表,有 name, height, age 等字段
· 一張 Family 表,包含了家庭的詳情
· 一張 City 表,包含了所有城市的信息

在 Android 上面把所有這些表聯合起來(假設 Person 表有超過2000條記錄)在大部分設備上是沒有問題的。但是假如你的用戶正在使用一個老版本的 SQL Lite 版本,你的應用就慢的無法使用了。你要盡量讓 join 的記錄越少越好以保證性能。例如,你從 Person 表中抽取一部分記錄再做 join,性能就會好很多。

這里的難點是如何知道用戶使用的是什么版本的 SQL Lite。雖然 Android 有一個默認的版本,但是似乎不同的廠商在不同的設備上用了不同的 SQL Lite 版本。這就給我們造成了很大的麻煩。

StackOverFlow 上有一些關于這方面的信息。總之嘗試去獲得設備的 SQL Lite 版本是很困難的,你最好還是把力氣花在優化 SQL 上面,以保證在所有的設備上都有良好的性能。

還有一個有趣的地方就是 Android 上面,一條查詢究竟是何時被執行的。也許你認為當你獲得 Cursor 對象的時候,查詢就執行完了。但事實情況是,查詢不會被執行直到 Cursor 被第一次訪問,例如 moveToNext,moveToFirst 操作。所以請不要在 UI 線程或者相關的線程中使用 cursor,否則界面會卡死。

原文鏈接 

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!