Android数据存储
文章目录
Android中的数据存储
持久化技术
持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证设备没电时数据也不会丢失。Android中有三种数据持久化的方式:
- 文件存储
- SharedPreferences存储
- SQLite数据库存储
接下来的demo将要实践上述3种方式,当然我们也要知道我们的数据存储是否成功,在3.0以上版本的AS中可直接打开Device File Explorer,在AS的右下角就可以打开啦
文件存储
将数据写入文件
这里需要用到一个Context的方法
openFileOutput
- Context类中的openFileOutput(“data”, Context.MODE_PRIVATE)方法,可以将数据存入指定文件。
- 第一个参数为文件名,第二个参数为模式。
- MODE_PRIVATE模式:每次将文件的数据重写
- MODE_APPED模式:如果存在就追加在最后,如果没有就新建
具体逻辑代码如下:
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText)findViewById(R.id.editText);
}
@Override
protected void onDestroy() {
super.onDestroy();
save(edit.getText().toString().trim());
}
private void save(String inputText){
FileOutputStream outputStream = null;
BufferedWriter writer = null;
try {
outputStream = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(outputStream));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
结果我们看到input存进去了,说明成功了:
写文件成功了,那我们想要得到存的数据应该怎么操作呢?
读取文件
与openFileOutput的方法相对:
openFileInput:
- openFileInput(“data”)
逻辑类似,我就只将load方法展现出来了,这里的存储用到了一些Java的知识,不太明白的可以去补一下Java的文件流读取、缓存等。
private void 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 {
try {
if (reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二次直接打开就读取了我上次赋的值啦!
SharedPreferences存储
不同于文件存储,Shared Preferences是使用键值对去存储的,就像json一样,所以我们使用起来就会轻松很多,而且还支持不同类型的数据存储。所以有两个优点:
- 数据以键值对形式去存储;
- 支持不同类型的数据存储。
存储流程
- 得到SharedPreferences对象
- 通过Context.getSharedPreferences(name, mode)方法,name为SharedPreferences文件的名字,看到这里你应该就知道SharedPreferences文件可以不只一个啦,第二个参数为模式,现在只有一个模式可选,默认为0,即只有当前程序可对SharedPreferences文件操作;
- 通过Activity.getPreferences(mode),自动将当前类名当作文件名,mode同上
- PerferenceManager.getSharedPreferences(context),以当前包名作为文件名获取文件
- 调用edit()方法来获取Editor对象
- 通过Editor对象添加数据,如putString()、putBoolean()
- 调用Editor对象的apply()提交
实现
我在onCreate方法中添加如下代码
SharedPreferences.Editor editor = getSharedPreferences("data", 0).edit();
editor.putString("name","liu");
editor.apply();
结果去文件中查找:有了!
那么读取数据就只需要把put操作换成get操作就好了。流程是一样的。
SQLite
不吹不黑,这个Android自带的数据库很棒!
SQLite有以下特点:
- 关系型
- 速度快,占用资源少
- 支持标准SQL语法,遵循ACID事务
(ps:在这里强烈推荐DBFLOW框架,使用指南:https://www.jianshu.com/p/9fe0e179f5bf)
新建数据库
首先我们需要新建一个类继承SQLiteOpenHelper类,SQLiteOpenHelper类集成了对SQLite的操作,让我们很方便的操作SQLite,在这个helper类中,初始化函数的参数含义是(上下文,数据库名,创建Cursor的工厂类,版本号)。
/**
* @Author: liuzhen
* @Description:
* @Date: Create in 19:58 2019/11/12
*/
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_PEOPLE = "create table People ( id integer primary key autoincrement,"
+ "name text, age integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PEOPLE);
Toast.makeText(mContext, "success", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
helper = new MyDatabaseHelper(this, "PEOPLE.db", null, 1);
Button create = findViewById(R.id.create);
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
helper.getWritableDatabase();
}
});
文件里发现数据库文件有了,而这个时候我们点击create按钮就没有效果啦,因为已经有了所以不会执行create方法。
增加数据
从上面建数据库的代码中我们可以发现调用helper.getWritableDatabase()方法会得到数据库实例SQLiteDatabase,我们就对这个实例操作来进行数据添加:
这里我犯了一个错误,将age的值赋成了string类型,应该是integer类型的。
然后通过adb命令查询表中的数据(我用navicat打开db文件结果看不了数据),如下:
查询结果:成功了!
修改数据
db.update("People", values, "name = ?", new String[] {"liu"});
参数说明
- 查询表名
- 插入的数据
- 限制条件,问号为占位符
- 第一个字符中的字符串,替换占位符
删除数据
db.delete("People", "name = ?", new String[] {"liu"});
参数说明
- 查询表名
- 插入的数据
- 限制条件,问号为占位符
效果就是直接删除我刚刚所有的liu
查询数据
query(表名,要查询出的列名,查询条件子句,对应于selection语句中占位符的值,要分组的列名,分组后过滤条件,排序方式)
结果保存在Cursor类中。
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.query("People",null,null,null,null,null,null);
if (cursor.moveToNext()){
do {
Log.d("name", cursor.getString(cursor.getColumnIndex("name")));
Log.d("age", ""+cursor.getInt(cursor.getColumnIndex("age")));
}while (cursor.moveToNext());
}
上一篇: XES格式(过程挖掘)详解