android系统中主要提供了三种方式用于简单的实现数据持久化功能,即文件存储、SharePreference存储以及数据库存储。
文件存储是Android中最基本的一种数据存储技术方式,它不对存储的内容进行任何的格式处理,所有的数据都是原封不动的保存到文件当中,比较适合用于存储一些简单的文本数据或二进制数据。
1、存文件
Context类提供了一个openFileOutput方法,可以用于将数据存储到指定文件中。该方法接收两个参数,第一个参数是文件名,在文件创建的时候使用的就是这个名称。第二个参数是文件的操作模式,MODE_PRIVATE是默认的模式,表示当指定同样的文件名的时候,所写入的内容将会覆盖原文件中的内容,MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。eg:
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
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();
}
}
}
2、读文件
Context类中还提供了一个openFileInput的方法,用于从文件中读取数据,它只接收一个参数,即要读取的文件名,并返回一个FileInputStream对象。eg:
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使用键值对的方式来存储数据。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = (Button) findViewById(R.id.save_data);
restoreData = (Button) findViewById(R.id.restore_data);
saveData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
}
});
运行程序后,在目录/data/data/包名/shard_prefs中可以看到一个data.xml文件。
2. 从SharedPreferences中读取数据
读取数据的过程很简单,看例子:
restoreData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
String name = pref.getString("name", "");
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
Log.d("MainActivity", "name is " + name);
Log.d("MainActivity", "age is " + age);
Log.d("MainActivity", "married is " + married);
}
});
}
Android系统内置了数据库,SQLite是一款轻量级的关系型数据库,运算速度快,占用资源少,可以用于保存一些数据量大、结构性复杂的数据。
public class MyDataBaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book ("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
private Context context;
public MyDataBaseHelper(Context context, String name,CursorFactory factory, int version)
{
super(context, name, factory, version);
this.context=context;
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_BOOK);
Toast.makeText(context, "Create successed", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
public class MainActivity extends Activity {
MyDataBaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper=new MyDataBaseHelper(this, "BookStore.db", null, 1);
Button button=(Button) findViewById(R.id.button1);
Button addData=(Button) findViewById(R.id.button2);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0)
{
dbHelper.getWritableDatabase();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
我们在onCreate方法中构建了一个MyDataBaseHelper对象,并且通过构造函数的参数将数据库指定为BookStore.db,版本号指定为1,然后在按钮点击事件响应中调用了getWritableDatabase方法,第一次点击按钮就会检测当前程序中并没有BookStore.db这个数据库,于是会创建该数据库并调用MyDataBaseHelper中的onCreate方法,这样Book表也就得到了创建。
2. 升级数据库
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
dbHelper=new MyDataBaseHelper(this, "BookStore.db", null, 2);
这样onUpgrade方法就会得到执行
3. 添加数据
addData.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name", "xujian");
values.put("author", "Dan Brow");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values);
values.clear();
values.put("name", "The Lost Symbol");
values.put("author", "Dan Brown");
values.put("pages", 510);
values.put("price", 19.95);
db.insert("Book", null, values);
}
});
注:第一行代码-Android读书笔记