Android中个人推崇的数据库使用方式

手机应用开发中经常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库,在上层进行了一层封装,同时还为我们提供了ContentProvider的框架,方便我们进行数据操作,以及在不同的程序之间进行数据共享。本文介绍一下,我在使用数据库的一些我认为比较好的习惯,欢迎与我讨论。

关于框架

通常网络操作,Json解析,我都会使用框架,这样可以很好的帮助我处理异常,处理异步操作。但是数据库操作我则使用自带的SQLiteHelper和ContentProvider,这样android系统在SQLite上为我们提供的一层封装。因此,我不再使用第三方的SQLite框架。SQLiteDatabase和ContentProvider为我们提供一下函数

1query() //查询 2insert() //插入 3delete() //删除 4update() //更新 5//参数和返回值我没有写

可以看到,android为我们提供的操作已经被封装了,很多地方和别的ORM框架也是有一些类似的。而且在android中我们通常不会存储非常复杂的数据结构,没必要给自己学习框架增加成本。

### 数据库建库升级等原则

先看一段代码

1private final class DatabaseHelper extends SQLiteOpenHelper { 2 public DatabaseHelper(final Context context) { 3 super(context, DB_NAME, null, DB_VERSION); 4 } 5 6 /** 7 * 1-->2 add header table 8 * 2-->3 update info 9 * 3--> update info haha 10 * 11 */ 12 public static final int DB_VERSION = 4; 13 public static final String DB_NAME = "download"; 14 15 /** 16 * Creates database the first time we try to open it. 17 */ 18 @Override 19 public void onCreate(final SQLiteDatabase db) { 20 if (Constants.LOGVV) { 21 Log.v(Constants.TAG, "populating new database"); 22 } 23 onUpgrade(db, 0, DB_VERSION); 24 } 25 26 /** 27 * Updates the database format when a content provider is used 28 * with a database that was created with a different format. 29 * 30 * Note: to support downgrades, creating a table should always drop it first if it already 31 * exists. 32 */ 33 @Override 34 public void onUpgrade(final SQLiteDatabase db, int oldV, final int newV) { 35 36 for (int version = oldV + 1; version <= newV; version++) { 37 upgradeTo(db, version); 38 } 39 } 40 41 /** 42 * Upgrade database from (version - 1) to version. 43 */ 44 private void upgradeTo(SQLiteDatabase db, int version) { 45 switch (version) { 46 case 1: 47 createDownloadsTable(db); 48 break; 49 case 2: 50 createHeadersTable(db); 51 break; 52 case 3: 53 addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_IS_PUBLIC_API, 54 "INTEGER NOT NULL DEFAULT 0"); 55 addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ALLOW_ROAMING, 56 "INTEGER NOT NULL DEFAULT 0"); 57 addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_ALLOWED_NETWORK_TYPES, 58 "INTEGER NOT NULL DEFAULT 0"); 59 break; 60 case 103: 61 addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_IS_VISIBLE_IN_DOWNLOADS_UI, 62 "INTEGER NOT NULL DEFAULT 1"); 63 makeCacheDownloadsInvisible(db); 64 break; 65 case 4: 66 addColumn(db, DB_TABLE, Downloads.Impl.COLUMN_BYPASS_RECOMMENDED_SIZE_LIMIT, 67 "INTEGER NOT NULL DEFAULT 0"); 68 break; 69 default: 70 throw new IllegalStateException("Don't know how to upgrade to " + version); 71 } 72 }

以上代码是摘自android 中的DownloadProvider的DatabaseHelper代码。我在这里主要是像推荐这种数据库的建表,最初接触这种建表方式是在以前阅读DownloadManager的时候发现,发现android中这种设计真的是非常精妙。这种方式,方便数据库的升级,在update数据库和create数据库的时候,可以共用建表,修改数据表的代码,同时可以清晰看到数据库的变化。

同时建议,在修改数据库版本的时候,在版本号上面增加注释,写上数据库升级的内容,方便自己以后看到数据库的变化,以及其他人在看代码时候,了解到数据库的变化。

数据库建表和数据存储建议

一些简单的配置文件,不建议存到数据库,存到sharepreference中,方便存取,同时也提高访问速度。

文件,图片等绝对不要存到数据库,存储文件路径到数据库中即可。

一些很复杂的数据,建议直接转成json存到数据库即可。一些缓存也可以这样存储。

其他要说的

数据库操作时候,不要在主线程操作。这是耗时操作,容易造成ANR.

在进行数据库中的数据显示时候,建议配合CursorLoader使用,这是android提供的异步数据加载,同时会在数据变化时候,自动重新刷新数据。

其他,本文,本人乱扯。如有你有异议,欢迎回复讨论。

原文地址:http://blog.isming.me/2014/10/13/good-database-use/,转载请注明出处。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

Android中个人推崇的数据库使用方式 - HelloWorld