這是我今年陸陸續續寫的有關android上數據庫操作的文章,以前都發布在開發論壇上,現在把整理到這裡。
1.由於SQLiteDatabase對象較為耗費資源,所以我們在使用完SQLiteDatabase對象之後,必須立即關閉它,避免它繼續占用資源,否則我們繼續程序可能會導致OOM或者其他異常;
2.同理,我們在使用完cursor之後也應該立即關閉cursor,避免資源浪費;
3.我們在關閉數據庫之前,必須將取得的數據保存到Map或者List中,否則關閉數據庫之後,數據也會隨之消失;
4.使用明確的查詢語句,在數據庫的查詢中避免使用select * from table這樣的語句,我們一般不會用到全部的數據,但這樣查詢不僅浪費時間,也浪費android有限的內存,所以我們必須明確查詢目標,例如:select id,name from people;
5.在較為頻繁的數據庫操作中(例如批量插入數據),可以使用數據庫事物來處理頻繁操作(如果只有一個數據操作,則android默認使用事物);
6.在sqlite數據庫中使用索引,給經常查詢的列創建索引,但索引不適用於較大的數據庫,較大的數據庫創建索引會耗費太多的時間,而且每次改動一條數據,整個索引都將重新創建;
7.如果需要在pc上制作數據庫db文件,推薦使用Navicat Premium,功能強大,但是費用也很強大,不過可以免費試用;
8.制作本地數據庫db文件的時候,需要使用UTF-8編碼(很多pc端sqlite3工具不支持utf-8編碼或者保持和系統編碼一致),否者在取數據的時候會出現亂碼,另外,根據我們使用的pc數據庫文件不同,我們可能會生成不同的sqlite3數據庫的後綴文件,例如.s3db文件,這個其實沒有影響,android數據庫會識別它的,如果你感覺別扭,可以手動改為.db就可以了,這也是沒關系的;
9.制作本地數據庫還有一點比較重要的就是默認主鍵必須為“_id”並設置為自動增長,不可以是其他的,而且每個表都必須有,如果你的數據庫沒有這個主鍵,在你的app運行中會報錯,日志提示缺少“_id”字段,至於為什麼應用內創建數據庫不會產生這樣的問題,那是因為android系統默認在創建數據庫的時候就是為“_id”為主鍵的,即使你沒有寫這樣的創建語句;
10.還有好多人不知道怎麼將mysql或者execl中的數據導入到sqlite3數據庫中,這裡我提供一個思路,可以將execl另存為csv文件,大部分數據庫也可以直接到處csv格式的文件,然後我們用記事本打開csv文件就會發現裡面就是inert into table values();可以直接放入values的部分,可以用java程序寫一個批量插入語句即可制作sqlite3 db數據庫文件;
11.制作好的sqlite3 db數據庫文件應該放在項目的assets文件夾或者res/raw文件夾中,然後在app啟動的過程中將數據庫用java io流復制到data/data/packagename/database目錄中(注意,如果你的db數據庫文件較大,請放在內存卡或者其他外存中);
12.如果你不想自己在sd卡上面的數據庫被普通文件浏覽器(android)直接掃描到,可以在sd中新建一個文件夾,並以”.“開頭,這樣的文件夾會被大部分的文件浏覽器過濾掉不顯示;
13.為了防止你的db數據庫文件被其他有心人獲取,你也可以將自己的數據庫的後綴偽裝成其他文件,例如.mp3,.dat之類的,但是需要注意的是,db文件會在應用打包生成apk的時候被壓縮(可以有效減少apk的體積),如果是mp3之類的文件的話,則不會被壓縮,經筆者測試,改為.dat格式也是可以被壓縮的,或者將db文件復制到sd卡的時候再改名為其他後綴;
14.如果數據庫中的信息比較敏感,大家也可以在加密數據之後再存入數據庫,取數據的時候在應用內解密,當然網上還有一些其他的加密手段,但是這些加密無一例外的都會犧牲掉更多相應時間和內存資源,所以大家在規劃app的時候必須自己考慮清楚