首页 > 代码库 > Android中常用的三种存储方法浅析
Android中常用的三种存储方法浅析
Android中常用的三种存储方法浅析
Android中数据存储有5种方式:
【1】使用SharedPreferences存储数据
【2】文件存储数据
【3】SQLite数据库存储数据
【4】使用ContentProvider存储数据
【5】网络存储数据
在这里我只总结了三种我用到过的或即将可能用到的三种存储方法。
一、使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基于XML文件存储key-value键值对数据。SharedPreferences接口本身只能获取数据而不支持存储和修改,需要调用edit()方法获取它所对应的Editor对象实现。
Editor提供如下方法来向SharedPreferences写入数据。
A.SharedPreferences.Editor clear():清空SharedPreferences里所有数据;
B.SharedPreferences.Editor putXXX(String key,xxx value):向SharedPreferences存入指定key对应的数据;
C.SharedPreferences.editor remove(String key):删除SharedPreferences指定key对应的数据项;
D.Boolean commit():当Editor编辑完成后,调用该方法提交修改。
下边介绍对SharedPreferences的简单读写,代码如下:
public class MainActivity extends Activity
{
SharedPreferences preferences;
SharedPreferences.Editor editor;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取只能被本应用程序读、写的SharedPreferences对象
preferences = getSharedPreferences("crazyit", MODE_PRIVATE);
editor = preferences.edit();
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
read.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
//读取数据,当程序所读取的数据文件不存在的时候,程序返回默认值。
// 读取字符串数据
String time = preferences.getString("time", null);
// 读取int类型的数据
int randNum = preferences.getInt("random", 0);
String result = time == null ? "您暂时还未写入数据" : "写入时间为:"
+ time + "\n上次生成的随机数为:" + randNum;
// 使用Toast提示信息
Toast.makeText(MainActivity.this, result
, Toast.LENGTH_SHORT).show();
}
});
write.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "
+ "hh:mm:ss");
//写入数据,由于SharedPreferences并不支持Date类型的值,将Date转化字符串后写入。
// 存入当前时间
editor.putString("time", sdf.format(new Date()));
// 存入一个随机数
editor.putInt("random", (int) (Math.random() * 100));
// 提交所有存入的数据
editor.commit();
}
});
}
}
SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。
其存储位置在/data/data/<包名>/shared_prefs目录下。
实现SharedPreferences存储的步骤如下:
(1)根据Context获取SharedPreferences对象
(2)利用edit()方法获取Editor对象。
(3)通过Editor对象存储key-value键值对数据。
(4)通过commit()方法提交数据。
二、文件存储数据
关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
文件可用来存放大量数据,如文本、图片、音频等。
默认位置:/data/data/<包>/files/***.***。
Content提供两种方法打开数据文件夹里的文件IO流:
(1)FileInputStream openFileInput(String name);
(2)FileOutputStream openFileOutput(String name,int mode)。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE:该文件只能被当前程序读写;
Context.MODE_APPEND :以追加方式打开该文件,应用程序可以向该文件中追加内容;
Context.MODE_WORLD_READABLE :该文件的内容可以被其他程序读取;
Context.MODE_WORLD_WRITEABLE :该文件的内容可由其他程序读写。
Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data/<package name>/cache目录 getFilesDir()方法用于获取/data/data/<package name>/files目录
程序如下:
public class MainActivity extends Activity
{
final String FILE_NAME = "crazyit.bin";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(new StringBuilder("a").append("b").append("c")
.toString());
// 获取两个按钮
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
// 获取两个文本框
final EditText edit1 = (EditText) findViewById(R.id.edit1);
final EditText edit2 = (EditText) findViewById(R.id.edit2);
// 为write按钮绑定事件监听器
write.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 将edit1中的内容写入文件中
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 读取指定文件中的内容,并显示出来
edit2.setText(read());
}
});
}
private String read()
{
try
{
// 打开文件输入流
FileInputStream fis = openFileInput(FILE_NAME);
byte[] buff = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder("");
// 读取文件内容
while ((hasRead = fis.read(buff)) > 0)
{
sb.append(new String(buff, 0, hasRead));
}
// 关闭文件输入流
fis.close();
return sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private void write(String content)
{
try
{
// 以追加模式打开文件输出流
FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
// 将FileOutputStream包装成PrintStream
PrintStream ps = new PrintStream(fos);
// 输出文件内容
ps.println(content);
// 关闭文件输出流
ps.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
三、SQLite数据库存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。
特点:
面向资源有限的设备,
没有服务器进程,
所有数据存放在同一文件中跨平台,
可自由复制。
数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。
SQLiteOpenHelper 的子类,至少需要实现三个方法:
1 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。
2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。
3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。
下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:
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 每次成功打开数据库后首先被执行
}
}
在Android SDK的platform-tools目录下提供一个sqlite3.exe文件,是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口。
Android中常用的三种存储方法浅析