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

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

时间: 2025-01-21 06:27:20

《Android和PHP开发最佳实践》一2.6 Android数据存储的相关文章

《Android和PHP开发最佳实践》一2.7 Android应用界面

2.7 Android应用界面 Android应用界面系统,即Android UI(User Interface)系统是Android应用框架最核心的内容之一,也是开发者们需要重点掌握的内容.如果我们把Android应用也分为前后端两部分的话,那么之前介绍的核心要点和四大组件等都属于后端,而Android UI系统则属于前端.后端保证应用的稳定运行,而前端则决定应用的外观和体验.对于一个优秀的Android应用来说,漂亮的外观和流畅的体验是必不可少的.接下来,我们便来学习Android外观系统的

《Android和PHP开发最佳实践》一2.10 Android开发环境

2.10 Android开发环境 前面我们已经学习了Android系统中最重要的基础概念的内容,那么接下来就要开始正式进入Android应用的实战开发阶段."工欲善其事,必先利其器",因此,我们先来熟悉Android应用的开发环境吧. Android应用的开发环境是基于Eclipse平台的,Eclipse的强大无需多说,它当然也适应于Windows XP.Mac OS.Linux等多种操作系统.另外,我们还需要安装一些必备的开发工具包,所需要的软件见表2-8. 2.10.1 开发环境的

《Android和PHP开发最佳实践》一2.4 Android系统四大组件

2.4 Android系统四大组件 之前我们已经学习了Android应用框架的四大核心要点,对Android的应用框架有了一个总体性的了解,接下来我们要学习Android应用程序中的四个重要组成部分,也就是我们一般所说的"应用组件".在前面讲解四大核心要点的篇幅中,我们曾经提到了控件(View控件)的概念,现在我们再来学习一下Android应用框架中的组件的概念.那么何谓组件呢?顾名思义,组件当然要比控件复杂,简而言之,组件是用于工业化组装的部件.要达到组件的标准,必须符合三个要求,以

《Android和PHP开发最佳实践》一1.3 如何学习Android和PHP

1.3 如何学习Android和PHP 前面我们已经讨论过"为何学"的问题,大家应该对Android加PHP这套应用开发解决方案有了大致的了解.接下来介绍"如何学"的问题,由于本书的内容比较广泛,既涉及客户端开发的技术也包含很多服务端开发的内容,所以在正式开始学习本书之前,先搞清楚应该使用什么样的学习方法比较有效是非常有必要的.接下来,笔者会把这个问题分解为以下几个部分来探讨. 1.3.1 如何学习Android 由于Android学习是本书最核心的内容,因此我们先

《Android和PHP开发最佳实践 》一3.2 PHP开发环境

3.2 PHP开发环境 前面我们已经学习了PHP编程语言的基础知识,接下来我们来了解PHP的开发环境.在此之前,我们先讨论一下PHP的开发工具.PHP是一种脚本语言,因此就语言本身特点而言,对开发工具没有什么严格的限制,从简单的Notepad和EditPlus到复杂的Zend Studio和Eclipse都可以进行PHP开发:但是在实际项目中,为了保证编码的一致性,以及代码版本管理的方便性,我建议大家在项目开发时使用Eclipse作为PHP编程开发的统一工具,如此一来,还可以和Android应用

《Android和PHP开发最佳实践》一2.9 Android动画效果

2.9 Android动画效果 适当地使用动画效果可以很好地提升Android应用或游戏的操作体验.目前Android系统支持的动画效果主要有两种,即逐帧动画(Frame Animation)和补间动画(Tween Animation).虽然,在Android 3.0以后的版本中还引入了新的动画系统,但是目前最主流的动画效果还是这两种. 2.9.1 逐帧动画(Frame Animation) 逐帧动画类似于GIF动画图片,即按照顺序播放图片.我们通常会在Android项目的res/drawabl

《Android和PHP开发最佳实践》一2.3 Android应用框架

2.3 Android应用框架 前面介绍了Android的系统框架,主要目的是让大家对Android系统有整体的概念,也为日后更深入的学习打好基础.然而,目前我们更需要重点学习和掌握的则是Android的应用框架,因为是否能掌握和理解Android应用框架,直接关系到是否能学好Android应用开发. Android的应用框架是一个庞大的体系,想要理解透彻并不是那么简单的事情,但是,好在其中有一些比较清晰的脉络可以帮助我们快速地熟悉这个系统,因此抓住这些脉络中的核心要点对于能否学好Android

《Android和PHP开发最佳实践 》一导读

前 言 2012年,移动互联网革命正在如火如荼地进行,一个充满机遇的巨大市场正在开启,无论是创业者还是从业者都需要做好准备.Android和PHP两种技术,作为目前移动领域和互联网领域中的热门技术,已经受到广大开发者们的关注. 本书是目前市面上唯一一本同时讲述Android客户端开发和PHP服务端开发两方面内容,并且把Android移动互联网应用开发的完整解决方案分析透彻的书籍.通过本书,您不仅可以学习到Android客户端开发技巧,而且可以掌握PHP服务端开发的精华,甚至还可以开拓软件架构的思

《Android和PHP开发最佳实践》一2.11 小结

2.11 小结 在本章中,首先我们学习了Android的系统框架和应用框架,然后熟悉了Android的四大核心要点和四大组件(活动Activity.服务Service.广播接收器Broadcast Receiver.内容提供者Content Provider),以及Android中一些常用的数据存储方式.随后,我们还学会了如何安装和配置Android的开发环境,并且动手开发了第一个Android应用Hello World项目,还学习了一些使用DDMS进行调试的方法. 最后,建议大家回顾一下本章的