欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android数据存储

程序员文章站 2024-03-17 20:00:04
...

Android中的数据存储

持久化技术

持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证设备没电时数据也不会丢失。Android中有三种数据持久化的方式:

  • 文件存储
  • SharedPreferences存储
  • SQLite数据库存储

接下来的demo将要实践上述3种方式,当然我们也要知道我们的数据存储是否成功,在3.0以上版本的AS中可直接打开Device File Explorer,在AS的右下角就可以打开啦
Android数据存储

文件存储

将数据写入文件

这里需要用到一个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存进去了,说明成功了:

Android数据存储

写文件成功了,那我们想要得到存的数据应该怎么操作呢?

读取文件

与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();
        }
    }
}

第二次直接打开就读取了我上次赋的值啦!

Android数据存储

SharedPreferences存储

不同于文件存储,Shared Preferences是使用键值对去存储的,就像json一样,所以我们使用起来就会轻松很多,而且还支持不同类型的数据存储。所以有两个优点:

  1. 数据以键值对形式去存储;
  2. 支持不同类型的数据存储。
存储流程
  1. 得到SharedPreferences对象
    • 通过Context.getSharedPreferences(name, mode)方法,name为SharedPreferences文件的名字,看到这里你应该就知道SharedPreferences文件可以不只一个啦,第二个参数为模式,现在只有一个模式可选,默认为0,即只有当前程序可对SharedPreferences文件操作;
    • 通过Activity.getPreferences(mode),自动将当前类名当作文件名,mode同上
    • PerferenceManager.getSharedPreferences(context),以当前包名作为文件名获取文件
  2. 调用edit()方法来获取Editor对象
  3. 通过Editor对象添加数据,如putString()、putBoolean()
  4. 调用Editor对象的apply()提交
实现

我在onCreate方法中添加如下代码

SharedPreferences.Editor editor = getSharedPreferences("data", 0).edit();
editor.putString("name","liu");
editor.apply();

结果去文件中查找:有了!

Android数据存储

那么读取数据就只需要把put操作换成get操作就好了。流程是一样的。

SQLite

不吹不黑,这个Android自带的数据库很棒!

SQLite有以下特点:

  1. 关系型
  2. 速度快,占用资源少
  3. 支持标准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方法。

Android数据存储

增加数据

从上面建数据库的代码中我们可以发现调用helper.getWritableDatabase()方法会得到数据库实例SQLiteDatabase,我们就对这个实例操作来进行数据添加:

Android数据存储

这里我犯了一个错误,将age的值赋成了string类型,应该是integer类型的。

然后通过adb命令查询表中的数据(我用navicat打开db文件结果看不了数据),如下:

Android数据存储

查询结果:成功了!

Android数据存储

修改数据
db.update("People", values, "name = ?", new String[] {"liu"});

参数说明

  • 查询表名
  • 插入的数据
  • 限制条件,问号为占位符
  • 第一个字符中的字符串,替换占位符

Android数据存储

删除数据
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());
}

Android数据存储