Android中我的推崇的數據庫使用方式

手機應用開發中常常會使用到數據庫存儲一些資料或者進行數據緩存,android中爲咱們提供了一個輕量的數據庫,在上層進行了一層封裝,同時還爲咱們提供了ContentProvider的框架,方便咱們進行數據操做,以及在不一樣的程序之間進行數據共享。本文介紹一下,我在使用數據庫的一些我認爲比較好的習慣,歡迎與我討論。java

關於框架

一般網絡操做,Json解析,我都會使用框架,這樣能夠很好的幫助我處理異常,處理異步操做。可是數據庫操做我則使用自帶的SQLiteHelper和ContentProvider,這樣android系統在SQLite上爲咱們提供的一層封裝。所以,我再也不使用第三方的SQLite框架。SQLiteDatabase和ContentProvider爲咱們提供一下函數android

query()  //查詢
insert() //插入
delete()  //刪除
update()  //更新
//參數和返回值我沒有寫

能夠看到,android爲咱們提供的操做已經被封裝了,不少地方和別的ORM框架也是有一些相似的。並且在android中咱們一般不會存儲很是複雜的數據結構,不必給本身學習框架增長成本。數據庫

### 數據庫建庫升級等原則json

先看一段代碼緩存

private final class DatabaseHelper extends SQLiteOpenHelper {
        public DatabaseHelper(final Context context) {
            super(context, DB_NAME, null, DB_VERSION);
        }
        
        /**
        * 1-->2 add header table
        * 2-->3 update info
        * 3--> update info haha
        *
        */
        public static final int DB_VERSION = 4;
        public static final String DB_NAME = "download";

        /**
         * Creates database the first time we try to open it.
         */
        @Override
        public void onCreate(final SQLiteDatabase db) {
            if (Constants.LOGVV) {
                Log.v(Constants.TAG, "populating new database");
            }
            onUpgrade(db, 0, DB_VERSION);
        }

        /**
         * Updates the database format when a content provider is used
         * with a database that was created with a different format.
         *
         * Note: to support downgrades, creating a table should always drop it first if it already
         * exists.
         */
        @Override
        public void onUpgrade(final SQLiteDatabase db, int oldV, final int newV) {

            for (int version = oldV + 1; version <= newV; version++) {
                upgradeTo(db, version);
            }
        }

        /**
         * Upgrade database from (version - 1) to version.
         */
        private void upgradeTo(SQLiteDatabase db, int version) {
            switch (version) {
                case 1:
                    createDownloadsTable(db);
                    break;
                case 2:
                    createHeadersTable(db);
                    break;
                case 3:
                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_IS_PUBLIC_API,
                              "INTEGER NOT NULL DEFAULT 0");
                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ALLOW_ROAMING,
                              "INTEGER NOT NULL DEFAULT 0");
                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES,
                              "INTEGER NOT NULL DEFAULT 0");
                    break;
                case 103:
                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI,
                              "INTEGER NOT NULL DEFAULT 1");
                    makeCacheDownloadsInvisible(db);
                    break;
                case 4:
                    addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT,
                            "INTEGER NOT NULL DEFAULT 0");
                    break;
                default:
                    throw new IllegalStateException("Don't know how to upgrade to " + version);
            }
        }

以上代碼是摘自android 中的DownloadProvider的DatabaseHelper代碼。我在這裏主要是像推薦這種數據庫的建表,最初接觸這種建表方式是在之前閱讀DownloadManager的時候發現,發現android中這種設計真的是很是精妙。這種方式,方便數據庫的升級,在update數據庫和create數據庫的時候,能夠共用建表,修改數據表的代碼,同時能夠清晰看到數據庫的變化。網絡

同時建議,在修改數據庫版本的時候,在版本號上面增長註釋,寫上數據庫升級的內容,方便本身之後看到數據庫的變化,以及其餘人在看代碼時候,瞭解到數據庫的變化。數據結構

數據庫建表和數據存儲建議

一些簡單的配置文件,不建議存到數據庫,存到sharepreference中,方便存取,同時也提升訪問速度。框架

文件,圖片等絕對不要存到數據庫,存儲文件路徑到數據庫中便可。異步

一些很複雜的數據,建議直接轉成json存到數據庫便可。一些緩存也能夠這樣存儲。ide

其餘要說的

數據庫操做時候,不要在主線程操做。這是耗時操做,容易形成ANR.

在進行數據庫中的數據顯示時候,建議配合CursorLoader使用,這是android提供的異步數據加載,同時會在數據變化時候,自動從新刷新數據。

其餘,本文,本人亂扯。若有你有異議,歡迎回復討論。

原文地址:http://blog.isming.me/2014/10/13/good-database-use/,轉載請註明出處。

相關文章
相關標籤/搜索