手机应用开发中常常会使用到数据库存储一些资料或者进行数据缓存,android中为我们提供了一个轻量的数据库。在上层进行了一层封装,同一时候还为我们提供了ContentProvider的框架。方便我们进行数据操作。以及在不同的程序之间进行数据共享。

本文介绍一下,我在使用数据库的一些我觉得比較好的习惯,欢迎与我讨论。

关于框架

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

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

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

 数据库建库升级等原则

先看一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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存到数据库就可以。

一些缓存也能够这样存储。

其它要说的

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

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

其它。本文。本人乱扯。

如有你有异议,欢迎回复讨论。

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

Android中个人推崇的数据库使用方式的更多相关文章

  1. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  2. Android中得到布局文件对象有三种方式

    Android中得到布局文件对象有三种方式 第一种,通过Activity对象 View view = Activity对象.getLayoutInflater().inflater(R.layout. ...

  3. Android中的5种数据存储方式

    本文转自  http://hi.baidu.com/maguowei/blog/item/7aca46c25574a33ae5dd3ba4.htmlAndroid数据存储Android提供了5种方式存 ...

  4. Android中通过导入静态数据库来提高应用第一次的启动速度

    一个Android应用给用户的第一印象非常重要,除了要有好的创意和美观的界面,性能也是很关键的部分,本文讨论的就是第一次启动的速度问题. Android应用的启动过程不能让用户等待太长时间,个人觉得最 ...

  5. 在Android中通过导入静态数据库来提高应用第一次的启动速度

    一个Android应用给用户的第一印象非常重要,除了要有好的创意和美观的界面,性能也是很关键的部分,本文讨论的就是第一次启动的速度问题. Android应用的启动过程不能让用户等待太长时间,个人觉得最 ...

  6. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  7. Android中的三种XML解析方式

    在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...

  8. Android中实现定时器的四种方式

    第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...

  9. Android中播放音乐的几种方式

    前言 前几天一直在研究RxJava2,也写了记录了几篇博客,但因为工作任务原因,需要研究音频相关的知识,暂时放下Rxjava,本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑 ...

随机推荐

  1. 【lua实战摸索】在b.lua调用a.lua的函数

    需要掌握知识: lua table的使用(创建自己函数的表作为函数库) 普通函数的调用:tab.func(tab,参数) 等效于表中函数的调用tab:func(参数) 基本思路: 1.在相同目录下创建 ...

  2. SQL Server连接不上本地服务器

    昨天星期一,到公司,如常打开电脑后,上个厕所,吃个早餐,电脑才完全醒来.打开项目后台,发现登不上,用户名或密码错误,认真输入几遍,还是错误,打开本地数据库,sql server连接不上,提示错误: 我 ...

  3. 我的java web之路(JSP基本语法)

    1.JSP注释 1.1输出注释 语法格式  <!--comment [<%= expression %>] --> <body> This is my JSP pa ...

  4. 我的java web之路(配置开发环境)

    这个学期学习java web开发,当然不能只靠上机的时间来练习,于是,便在自己的电脑上安装一系列的软件... 1.JDK的安装.首先,下载Java JDK,可以到sun公司网站下载.一定要下载适合自己 ...

  5. 【51nod 1791】 合法括号子段

    有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1.空序列是合法括号序列. 2.如果S是合法括号序列,那么(S)是合法括号序列. 3.如果A和B都是合法括号序列 ...

  6. UVALive - 6267 Beer Pressure

    题意: 给定n个酒吧, 然后有k个学生投票今晚去哪个酒吧, 然后会有a个(a<=k)学生先投票了, 先投的票会影响后面的人投票的概率, 求每个酒吧今晚去的概率. 分析: 我们可以从最初的状态开始 ...

  7. reactNative 介绍

    React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安 ...

  8. 大数据学习——linux常用命令(二)

    二.目录操作 1 查看目录信息 ls / 查看根目录下的文件信息 ls . 或者 ls ./查看当前目录下的文件信息 ls ../查看根目录下 ls /home/hadoop ls -l . 查看当前 ...

  9. 第k小整数(树状数组)

    洛谷传送门 入门难度.. 没错,但是我并不是要暴力做. 而是用树状数组来做. 先离散化,然后随便搞一搞就可以了.(晕.比暴力还慢) 如果要查找某一区间的的话可以把区间取出重新建树,然后再求.(更暴力) ...

  10. PHP日历程序编写(简单实现)

    <meta charset="utf-8"><?php $year = isset($_GET['year']) ? $_GET['year'] : date(& ...