《Android和PHP开发最佳实践》一2.6 Android数据存储-阿里云开发者社区

开发者社区> 华章计算机> 正文

《Android和PHP开发最佳实践》一2.6 Android数据存储

简介: 本节书摘来自华章出版社《Android和PHP开发最佳实践》一书中的第2章,第2.6节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看
+关注继续查看

2.6 Android数据存储

前面刚介绍过上下文对象的使用,其最重要的功能之一,就是用于存储应用运行期间产生的中间数据。接下来,我们来讨论Android应用中持久化类型数据的存储方案。对于移动互联网应用来说,我们经常把核心数据存储在服务端,也就是我们常说的“云端”,但是在实际项目中也会经常使用到Android系统内部的数据存储方案,接下来让我们认识一下几种最常用的数据存储方案。

2.6.1 应用配置(Shared Preferences)

在Android系统中,系统配置(Shared Preferences)是一种轻量级的数据存储策略,只能用于存储key-value格式的数据(类似于ini格式),因此这个特点也决定了我们不可能在其中存储其他各种复杂格式的数据。由于系统配置使用起来比较简单方便,所以我们经常用它来存储一些类似于应用配置形式的信息。代码清单2-14就是一个简单的例子。
代码清单 2-14

...
settings = getPreferences(Context.MODE_PRIVATE);
if (settings.getString("username", null) == null) {
       SharedPreferences.Editor editor = settings.edit();
       editor.putString("username", "james");
       editor.commit();
}
...

以上代码的逻辑很简单:先检查是否存在“username”的值,若不存在则保存“james”字符串为“username”。这里我们重点分析两点:首先是关于Context.MODE_PRIVATE,MODE_PRIVATE代表此时Shared Preferences存储的数据是仅供应用内部访问的,除此之外,Android系统中还提供MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE两种模式,分别用于表示数据是否允许其他应用来读或者写;另外还需要注意的一点是,我们在操作数据的时候必须使用SharedPreferences.Editor接口来编辑和保存数据,最后还必须调用commit方法进行提交,否则数据将不会被保存。
另外,系统配置信息会被存储在“/data/data”下对应的应用包名下的shared_prefs目录里,一般是以XML文件格式来存储的。在Eclipse中,我们可以使用DDMS工具(本章的2.10.3节会介绍)打开对应的目录进行查看。

2.6.2 本地文件(Files)

将数据保存成为文件应该是所有系统都会提供的一种比较简单的数据保存方法,我们已经知道Android系统是基于Linux系统来开发的,而Linux系统就是一个文件系统,很多的数据都是以文件形式存在的。与系统配置不同,文件可存储的格式是没有限制的,所以使用范围自然也比系统配置广得多,除了可用于各种类型文件的读写,我们还经常用于保存一些二进制的缓存数据,比如图片等。
在Android中,我们一般使用openFileOutput方法来打开一个文件,此方法会返回一个FileInputStream对象,然后我们就可以选择使用合适的方法来操作数据。比如,对于cfg或者ini类型的文件来说,我们可以使用Properties的load方法来直接载入;对于其他普通的文件,我们则可以使用InputStreamReader和BufferedReader来读取。代码清单2-15就是一个典型的在Android系统中读取文件内容的例子。
代码清单 2-15

...
public String getFileContent (String filePath) {
    StringBuffer sb = new StringBuffer();
    FileInputStream stream = null;
    try {
        stream = this.openFileInput(filePath);
        BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
    } catch (...) {
        ...
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (...) {
                ...
            }
        }
    }
    return sb.toString();
}
...

在上面的代码中,我们实现了一个名为getFileContent的方法,用于获取对应文件的内容;其中就使用了openFileInput来获取文件数据,并通过一系列的拼装,最终返回整个文件的内容。另外,我们需要了解一下,在Android系统中,文件一般会存储到和配置文件同级的目录下,只不过目录名不是shared_prefs,而是files。更多关于Android文件存储的例子我们会在本书第7章中进行详细介绍。

2.6.3 数据库(SQLite)

关于数据库的概念,我相信大家都已经非常熟悉了。Android系统给我们提供了一个强大的文本数据库,即SQLite数据库。它提供了与市面上的主流数据库(如MySQL、SQLServer等)类似的几乎所有的功能,包括事务(Transaction)。由于篇幅限制,我们不能在这里介绍太多关于SQLite数据库的内容,因此,如果大家想了解更多信息请到SQLite的官方网站(http://www.sqlite.org)查看。
与之前介绍的两种数据存储模式不同,数据库的存储方式偏向于存取的细节,比如,我们可以把同一类型的数据字段定义好,并保存到统一的数据表中去,进而可以针对每个数据进行更细节的处理。所以,如果可能的话,尽量使用数据库来存储数据,这样会大大增强应用的结构性和扩展性。另外,我们还经常把SQLite数据库和前面所提到的Android四大组件之一的“数据提供者”结合使用,因为它们对于“增删查改”接口的定义和使用实际上是一致的。另外,我们在使用的过程中经常通过继承SQLiteOpenHelper类并实现其中的抽象方法的形式来构造基础的DB操作类,使用范例如代码清单2-16所示。
代码清单 2-16

...
public class DBHelper extends SQLiteOpenHelper {
    
    /* 数据库配置 */
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "mydb.db";
    private static final String DB_TABLE = "mytable";
    
    /* 数据库初始化和更新SQL */
    private static final String SQL_CREATE = "CREATE TABLE ...";
    private static final String SQL_DELETE = "DROP TABLE ...";
    
    /* 构造函数 */
    public DBHelper(Context context){
        super(context, DB_NAME, null, DB_VERSION);
    }
    
    /* 初始化数据库 */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE);
    }
    
    /* 升级数据库 */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(SQL_DELETE);
    }
}
...

此外,在需要使用的时候,我们可以通过getReadableDatabase和getWritableDatabase来获取数据库句柄分别进行读和写的操作。另外,数据库文件会被存在shared_prefs和files的同级目录下,目录名为databases。关于SQLite数据库的更多用法,我们也会在第7章中结合具体实例做进一步的介绍。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package ……; import android.
703 0
Android开发14——监听内容提供者ContentProvider的数据变化
  一、提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。     二、示例代码 A应用 /** * 对内容提供者进行操作 * * @author XY * */ public cla
889 0
开源最佳实践:Android平台页面路由框架ARouter
为了更好地让开发者们更加深入了解阿里开源,阿里云云栖社区在3月1号了举办“阿里开源项目最佳实践”在线技术峰会,直播讲述了当前阿里新兴和经典开源项目实战经验以及背后的开发思路,在本次在线技术峰会上,阿里云资深开发工程师刘志龙分享了Android平台页面路由框架ARouter的技术方案、解决的问题以及在实际场景中的最佳实践。
43294 0
Android存储之SQLite数据库
Android存储之SQLite数据库数据库 创建数据库 package ……; import android.
490 0
Android开发18——获取网络资源之json数据
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的JSON数据。Android应用解析JSON比XML性能要好,但有许多项目仍然采用的是XML。     二、实例代码 Web项目 /** * 新闻业务类 * * @author 徐越 * */ public cl
1046 0
Android数据存储
IO :http://www.cnblogs.com/hxsyl/p/3302852.html getParentFile()的返回值是File型的。 而getParent() 的返回值是String型的。
660 0
《深入理解Android:Telephony原理剖析与最佳实践》一导读
目前国内市场上针对Android的书籍很多,但这些书籍中,绝大多数是基于Android SDK在应用层的开发进行讲解的。针对Android系统级的源代码分析的书籍,主要是邓凡平著的《深入理解Android:卷Ⅰ》和《深入理解Android:卷Ⅱ》,但深入理解Android Telephony的书籍国内目前还是空白。
1052 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载