对于有些数据,关键性的数据,不希望程序关闭或关机的时候,它存在一会儿就消失,就需要用到数据的持久化技术。Android开发中不可避免的使用到这个技术,下面的提到的三种方式是比较“古老”的技术,但是我们还是要了解下。
持久化的技术是指将内存中的瞬时数据保存到存储设备中,保证设备关机的状态下数据仍不会丢失。即可以让数据在瞬时状态和持久状态之间进行转换。
Android系统提供了三种方式: 1. 文件存储(简单地实现数据持久化功能) 2. SharePReference存储 3. 数据库存储 还可以SD卡中保存,但以上三种保存相对简单,也会比用SD卡保存的安全
| 方式 | 方法 | 使用范围 | 存储位置 |
|---|---|---|---|
| 文件存储 | openFileInput() openFileOutput() | 二进制数据/简单文本 | data/data/<package_name>/files/ |
| SharedPreferences存储 | Context.getSharedPreferences()Activity.getPreferences()PreferenceManager.getDefaultSharedPreferences() | 支持多种不同的数据类型 | data/data/<package_name>/shared_prefs/ |
| SQLite数据库存储 | SQLiteOpenHelper抽象类;getReadableDatabase() 和getWritableDatabase()实例方法 | 关系型数据库 | /data/data/<package name>/databases/ |
这是Android中最基本的数据存储方式,不对存储内容进行任何的格式化处理,即原封不动的保存到文件中,适合 :存储简单的文本数据或者二进制数据。 如果想用来保存较复杂的文本数据就要定义一套自己的格式规范,方便数据的解析。
Context 类中提供了一个openFileOutput ()方法,可以用于将数据存储到指定的文件中。 第一个参数,就是文件创建时使用的名称,制定文件名不可以包含路径名,文件默认保存的路径/data/data//files/ 目录下的。 第二个参数,文件操作模式,MODE_PRIVATE 和MODE_APPEND。
openFileOutput() 方法返回是一个FileOutputStream对象,得到这个对象后可以使用java流写入到文件中。 代码:
public void save(String inputText) { FileOutputStream out = null; BufferedWriter writer = null; try { //开打data文件 out = openFileOutput("data", Context.MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(inputText); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } } catch (IOException e) { e.printStackTrace(); } } }public String load() { FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try { in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { content.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return content.toString(); }这个SharedPreferences对象是使用键值对的方式来存储数据的。保存的时候,给这需要的数据提供一个对应的键,读取的时候也是通过键。SharePreferences存储支持多种不同的数据类型存储(存储的是整型,读取出来的数据也是整型;存字符串,取的是字符串)。
三种方法可得到SharePreferences对象 1. Context类中的getSharedPreferences()方法 public void contextSharedPre(){ SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE); //获取存储的数据 直接pref.getString("name","默认值"); SharedPreferences.Editor editor = pref.edit(); editor.putString("name","lily"); editor.putString("age","20"); editor.putBoolean("married",false); editor.commit(); } 2. Activity类中的getPreferences()方法 public void activitySharedPre(){ SharedPreferences pref = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putString("name","lily"); editor.putString("age","20"); editor.putBoolean("married",false); editor.commit(); } 3. PreferenceManager类中的方法getDefaultSharedPreferences()(是一个静态方法) 这是一个静态方法,它接收一个Context 参数,并自动使用当前应用程序的包名作 为前缀来命名SharedPreferences 文件。 得到了SharedPreferences 对象之后,就可以开始向SharedPreferences 文件中存储数据了, 主要可以分为三步实现。 3.1 调用SharedPreferences 对象的edit()方法来获取一个SharedPreferences.Editor 对象。 3.2 向SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用 putBoolean 方法,添加一个字符串则使用putString()方法,以此类推。 3.3 调用commit()方法将添加的数据提交,从而完成数据存储操作。
SQLiteOpenHelper 类可以简单地对数据库进行创建和升级,这个类有两个抽象方法,分别是onCreate()和onUpgrade()。 还有两个非常重要的实例方法, getReadableDatabase() 和getWritableDatabase()。两方法都可以创建或打开一个现有的数据库,不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
SQLiteOpenHelper有两个构造方法可供重写,其中一个有四个参数 :Context、数据库名、Cursor、当前数据库的版本号。构造SQLiteOpenHelper 的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了数据库文件会存放在/data/data//databases/目录下。此时,重写的onCreate()方法也会得到执行,在这里去处理一些创建表的逻辑。
关于SQLite的查询使用,SQLiteDatabase中提供了一个query()方法用于对数据进行查询。其第一个参数 是要查询数据的表名,第二指定去查询哪一列,三四 用于约束查询某一行或几行的数据,第五参数 用于对group by 之后的数据进一步过滤,第七是查询结果的排序方式。 
query()方法会返回一个Cursor对象,查询的结果从这个对象中取出。
附件:adb是Android SDK 自带一个调试工具,使用此工具可以直接对连接到电脑上的手机或者模拟器进行调试操作。它存在于sdk的platform-tools目录下,需要将它的路径配置到环境变量里。Windows DOS命令下输入adb shell进入设备控制台,cd /data/data//databases/目录下,输入sqlite3打开数据库。(另外通过su root获得权限)
新闻热点
疑难解答