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

相关文章
|
24天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
101 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
19 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
3天前
|
Java Go PHP
开发语言漫谈-PHP
PHP即“Hypertext Preprocessor”
|
5天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
8天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
9天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
18 5
|
16天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
18天前
|
监控 算法 Android开发
安卓应用开发:打造高效启动流程
【4月更文挑战第5天】 在移动应用的世界中,用户的第一印象至关重要。特别是对于安卓应用而言,启动时间是用户体验的关键指标之一。本文将深入探讨如何优化安卓应用的启动流程,从而减少启动时间,提升用户满意度。我们将从分析应用启动流程的各个阶段入手,提出一系列实用的技术策略,包括代码层面的优化、资源加载的管理以及异步初始化等,帮助开发者构建快速响应的安卓应用。