《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章中结合具体实例做进一步的介绍。

相关文章
|
4天前
|
PHP Android开发
android通过http上传文件,服务器端用php写(原创)
android通过http上传文件,服务器端用php写(原创)
14 4
|
11天前
|
存储 安全 Android开发
安卓应用开发:构建一个高效的用户登录系统
【5月更文挑战第3天】在移动应用开发中,用户登录系统的设计与实现是至关重要的一环。对于安卓平台而言,一个高效、安全且用户体验友好的登录系统能够显著提升应用的用户留存率和市场竞争力。本文将探讨在安卓平台上实现用户登录系统的最佳实践,包括对最新身份验证技术的应用、安全性考量以及性能优化策略。
|
12天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
13天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
|
4天前
|
Java Android开发
Android开发--Intent-filter属性详解
Android开发--Intent-filter属性详解
|
4天前
|
物联网 Java 开发工具
安卓应用开发:打造未来移动生活
【5月更文挑战第10天】 随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的一部分。作为智能手机市场的两大巨头,安卓和iOS分别占据了一定的市场份额。在这篇文章中,我们将重点关注安卓应用开发,探讨如何利用先进的技术和创新思维,为用户打造更加便捷、智能的移动生活。文章将涵盖安卓应用开发的基本概念、关键技术、以及未来发展趋势等方面的内容。
|
5天前
|
Java API 开发工具
java与Android开发入门指南
java与Android开发入门指南
12 0
|
6天前
|
Android开发 Kotlin
Kotlin开发Android之基础问题记录
Kotlin开发Android之基础问题记录
16 1
|
6天前
|
Java Android开发
Android开发@IntDef完美替代Enum
Android开发@IntDef完美替代Enum
13 0
|
7天前
|
Android开发
Android 盒子开发过程中遇到的问题及解决方法
Android 盒子开发过程中遇到的问题及解决方法
8 2