Android开发中,对数据的存储是很重要的,其中主要的存储方式有五种:SharedPreferences存储数据、文件存储数据、SQLite数据库存储数据、Content Provider存储数据、网络存储数据,下面一一介绍:
一、SharedPreferences存储数据
SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
实现SharedPreferences存储的步骤如下:
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
一、根据Context获取SharedPreferences对象
二、利用edit()方法获取Editor对象。
三、通过Editor对象存储key-value键值对数据。
四、通过commit()方法提交数据。
void saveInfo(Context context,String name,int age,boolean marriage){ //获取SharedPreferences对象 SharedPreferences sp = context.getSharedPreferences("SP", 0); //存入数据 Editor editor = sp.edit(); editor.putString("name", name); editor.putInt("age", age); editor.putBoolean("marriage", marriage); editor.commit(); }
读取SharedPreferences的方式:void initView() { SharedPreferences userInfo = getSharedPreferences("SP", 0); String username = userInfo.getString("name", ""); int userage = userInfo.getInt("age", 0); boolean usermarriage = userInfo.getBoolean("marriage", false); name.setText(username); age.setText(userage); if(usermarriage){ marriage.setText("是"); } else { marriage.setText("否"); } }
SharedPreferences虽然使用方便,但他只能存储boolean、int、long、float、String五种基本数据类型,只能用于简单数据保存。
二、文件存储数据
文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法。
Android封装的文件操作:
保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式。
读取文件内容:通过Context.openFileInput获取输入流,参数为文件名。
删除文件:Context.deleteFile删除指定的文件,参数为将要删除的文件的名称。
获取文件名列表:通过Context.fileList获取files目录下的所有文件名数组。
读取文件内容:通过Context.openFileInput获取输入流,参数为文件名。
删除文件:Context.deleteFile删除指定的文件,参数为将要删除的文件的名称。
获取文件名列表:通过Context.fileList获取files目录下的所有文件名数组。
其中,存储模式为:
MODE_PRIVATE为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下写入的内容会覆盖原文件的内容。
MODE_APPEND 检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE 表示当前文件可以被其他应用读取。
MODE_WORLD_WRITEABLE 表示当前文件可以被其他应用写入。
MODE_APPEND 检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE 表示当前文件可以被其他应用读取。
MODE_WORLD_WRITEABLE 表示当前文件可以被其他应用写入。
在使用模式时,可以用"+"来选择多种模式,比如openFileOutput(filename, Context.MODE_PRIVATE + MODE_WORLD_READABLE);
void writeFiles(Context c, String fileName, String content, int mode)
throws Exception {
// 打开文件获取输出流,文件不存在则自动创建
FileOutputStream fos = c.openFileOutput(fileName, mode);
fos.write(content.getBytes());
fos.close();
}
String readFiles(Context c, String fileName) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
FileInputStream fis = c.openFileInput(fileName);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String content = baos.toString();
fis.close();
baos.close();
return content;
}
三、SQLite数据库存储数据
SQLite数据库是Android内嵌的轻量级的数据库,支持基本的数据库操作。
SQLite3支持NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型。SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。
Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API。
Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 创建数据库后,对数据库的操作
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改数据库版本的操作
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功打开数据库后首先被执行
}
}
SQLite的使用方法和其他数据库基本一致,这里就不在赘述了。
四、Content Provider存储数据
Content Provider是Android四大组件之一,提供给不同应用程序之间实现数据共享。
public Uri insertValues(Uri uri, ContentValues cv) {
Uri muri=context.getContentResolver().insert(uri, cv);
return muri;
}
public int updateValues(Uri uri, ContentValues cv, String where, String[] selectionArgs) {
return context.getContentResolver().update(uri, cv, where, selectionArgs);
}
public Cursor queryValues(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
} catch (Exception ex) {
ex.printStackTrace();
}
return cursor;
}
public int deleteValues(Uri uri, String where, String[] selectionArgs) {
int resultcode = 0;
try {
resultcode = context.getContentResolver().delete(uri, where, selectionArgs);
} catch (Exception ex) {
ex.printStackTrace();
}
return resultcode;
}
五、网络存储数据
前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取。
我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。