五种:SharedPreferences ;文件;SQLite数据库;ContentProvider;网络存储数据
1:SharedPreferences
Android平台上一个轻量级的存储类
可以保存基本类型;
本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息;
其存储位置在/data/data/<名>/shared_prefs目录下;
整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少;
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现;
与SQLite数据库相比,优点:免去了创建数据库,创建表,写SQL语句等诸多操作,更加方便,简洁。缺点,只存储boolean,int,float,long和String五种简单的数据类型,不论如何简单,它也只能是存储方式的一种补充,无法完全替代如SQLite数据库这样的其他数据存储方式。
因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。
2:文件存储
文件可用来存放大量数据,如文本、图片、音频等;
默认位置:/data/data/<包>/files/;
openFileOutput()方法可以用于把数据输出到文件中;
openFileOutput()方法的第二参数用于指定操作模式,有四种模式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容;
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入;
android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。
/**
* 保存内容,注:允许其他应用对该文件读和写
* @param filename 文件名称
* @param content 文件内容
* @throws Exception
*/
public void saveRW(String filename, String content) throws Exception{
FileOutputStream outStream = context.openFileOutput(filename,
Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE);
outStream.write(content.getBytes());
outStream.close();
}
/**
* 读取文件内容
* @param filename 文件名称
* @return
* @throws Exception
*/
public String readFile(String filename) throws Exception{
FileInputStream inStream = context.openFileInput(filename);
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while( (len = inStream.read(buffer))!= -1){
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();//得到文件的二进制数据
outStream.close();
inStream.close();
return new String(data);
}
3:SQLite
是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能,此外它还是开源的,任何人都可以使用它;
数据库存储在 data/< 项目文件夹 >/databases/ 下;
Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库;
在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据;
Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库;SQLiteOpenHelper 的子类,至少需要实现三个方法:构造函数;onCreate();onUpgrage(),它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
特点:面向资源有限的设备;没有服务器进程;所有数据存放在同一文件中跨平台;可自由复制;SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.);Android 在运行时(run-time)集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库;