Android 数据存储
1. SharedPreferences 存储
Android提供的用来以最简单的方式对数据进行永久保存的方法,以XML文件形式,保存在手机中的data/data/com.xxx.xxx/
目录中。
存储数据基本步骤:
-
获取
SharedPreferences
对象getSharedPreferences(String name, int mode)
其中,name指文件名;mode指访问权限,常用
MODE_PRIVATE
(被本应用读写),MODE_MULTI_PROCESS
(跨引用读写)当然也可以直接用
getPreferences(int mode)
来仅指定权限 -
获取
SharedPreferences.Editor
对象<SharedPreferences>.eidt()
-
向
SharedPreferences.Editor
对象添加数据<SharedPreferences.Editor>.put<数据类型>()
,如putBoolean()
-
提交数据
<SharedPreferences.Editor>.commit()
读取数据基本步骤:
-
获取
SharedPreferences
对象 -
获取数据
<SharedPreferences>.get<数据类型>()
,如getBoolean()
2. 文件存储
将文件存储到本地磁盘,分为内部存储和外部存储。
2.1 内部存储
内部存储:将文件存储在系统的data/data/<包名>/files/
目录下,这些文件只能被本应用访问,卸载后会被删除。
保存举例:
FileOutputStream fos = null;
try{
fos = openFileOutput("文件名", <访问权限 int mode>);
fos.write(Byte[] data);//写数据到输出流
fos.flush();// 清缓存
} catch (Exception e) {
} finally {
if (fos != null) {
fos.close();
}
}
读取举例:
FileInputStream fis = null;
byte[] buffer = null;// 缓冲数据
String data = null;// 字符串类型数据
try {
fis = openFileInput("文件名");
buffer = new byte[fis.available()];// 实例化字节数组
fis.read(buffer);
} catch (Exception e) {
} finally {
if (fis != null) {
fis.close();
data = new String(buffer);
}
}
2.2 外部存储
使用举例:
package com.mingrisoft;
import android.app.Activity;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends Activity {
byte[] buffer = null; //定义保存数据的数组
private File file; //定义存储路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etext = (EditText) findViewById(R.id.editText); //获取用于填写记事本信息的编辑框组件
ImageButton btn_save = (ImageButton) findViewById(R.id.save); //获取保存按钮
ImageButton btn_abolish = (ImageButton) findViewById(R.id.abolish); //获取取消按钮
file = new File(Environment.getExternalStorageDirectory(), "Text.text"); //设置存储sd卡根目录
btn_save.setOnClickListener(new View.OnClickListener() { //实现外部存储填写的文本信息
@Override
public void onClick(View v) {
FileOutputStream fos = null; //定义文件输出流
String text = etext.getText().toString(); //获取文本信息
try {
fos = new FileOutputStream(file); //获得文件输出流,并指定文件保存的位置
fos.write(text.getBytes()); //保存文本信息
fos.flush(); //清除缓存
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close(); //关闭文件输出流
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
});
//实现第二次打开应用时显示上一次所保存的文本信息
FileInputStream fis = null; //定义文件输入流
try {
fis = new FileInputStream(file); //获得文件输入流
buffer = new byte[fis.available()]; //保存数据的数组
fis.read(buffer); //从输入流中读取数据
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close(); //关闭输入流
String data = new String(buffer); // 获得数组中保存的数据
etext.setText(data); //保存到编辑框中
} catch (IOException e) {
e.printStackTrace();
}
}
}
btn_abolish.setOnClickListener(new View.OnClickListener() { //实现单击取消按钮,退出应用
@Override
public void onClick(View v) {
finish(); //退出应用
}
});
}
}
3. 数据库存储
操作安卓内部存储中的SQlite3数据库
基本步骤:
-
创建自定义数据库操作类,继承自
SQLiteOpenHelper
,重写构造函数,实现抽象方法。Oncreate()
:连接数据库后,可以用db.execSQL(<string sql>)
执行SQL语句onUpgrade()
:数据库版本更新
举例:
package com.mingrisoft; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by Administrator. */ public class DBOpenHelper extends SQLiteOpenHelper { //定义创建数据表dict的SQL语句 final String CREATE_TABLE_SQL = "create table dict(_id integer primary " + "key autoincrement , word , detail)"; public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, null, version); //重写构造方法并设置工厂为null } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_SQL); //创建单词信息表 } @Override // 重写基类的onUpgrade()方法,以便数据库版本更新 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //提示版本更新并输出旧版本信息与新版本信息 System.out.println("---版本更新-----" + oldVersion + "--->" + newVersion); } }
使用:
-
获取数据库对象{操作基础):
<SQLiteOpenHelper>.getReadableDatabase()
-
增:
<SQLiteDatabase>.insert (String table, String nullColumnHack, ContentValues values)
使用举例:
ContentValues values=new ContentValues(); values.put("key", value); //保存数据 readableDatabase.insert("数据库名",null , values);//执行插入操作
-
删:
<SQLiteDatabase>.delete (String table, String whereClause, String[] whereArgs)
table
:数据库表whereClause
:对应SQL中的where
语句部分whereArgs
:若whereClause
中含有?
,则将被whereArgs
中的数据替换。
-
改:
public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
-
查:
public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
selection
等于whereClause
distinct
:是否严格限制,是则每行唯一。
-
Cursor
:数据库结果集使用举例:
Cursor cursor=dbOpenHelper.getReadableDatabase().query("dict",null ,"word = ?",new String[]{key},null,null,null); ArrayList<Map<String, String>> resultList = new ArrayList<Map<String, String>>(); //创建ArrayList对象,用于保存查询出的结果 while (cursor.moveToNext()) { // 遍历Cursor结果集 Map<String, String> map = new HashMap<>(); // 将结果集中的数据存入HashMap中 // 取出查询记录中第2列、第3列的值 map.put("word", cursor.getString(1)); map.put("interpret", cursor.getString(2)); resultList.add(map); //将查询出的数据存入ArrayList中 }
-
其他类型的SQL语句(非
select, update, delete, insert
):public void execSQL (String sql, Object[] bindArgs)