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/,转载请注明出处。

相关文章
相关标签/搜索