APP & programandroid

Android中数据持久化技术

2023-01-30  本文已影响0人  BlueSocks

1、文件存储

文件存储不会对存储的数据进行任何的格式化处理,所有数据都是原封不动的保存到文件中,适合存储一些简单的文本数据或二进制数据。


Ⅰ文件写入openFileOutput()

/**
     * 写入数据
     */
    private void writeData(String text){

        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("test", MODE_PRIVATE);                 // 两个参数:参数1是文件保存的文件名,参数2是保存模式,MODE_PRIVATE是如果文件已存在则替换,MODE_APPEND是文件已存在就在原文件拼接新数据
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(text);
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try {
                if (writer != null)writer.close();
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }
    }

Ⅱ文件读取openFileInput()

/**
     * 读取数据
     */
    private String readData(String fileName){

        if (fileName.isEmpty()) return null;

        FileInputStream input = null;
        BufferedReader reader = null;
        StringBuilder stringBuilder = new StringBuilder();

        try {
            input = openFileInput(fileName);
            reader = new BufferedReader(new InputStreamReader(input));

            String line = "";
            while ((line = reader.readLine()) != null){
                stringBuilder.append(line);
            }
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try {
                if (reader != null) reader.close();
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }

        return stringBuilder.toString();
    }

2、sharedPreferences存储

使用键值对存储数据,支持多种不同的数据类型存储,读取和写入数据格式不变。


sharedPreferences存储首先要获取SharedPreferences实例对象,根据所在的不同的类有不同的获取方法,如下:

/**
 * Context类中获取
 *
 * parmas name: 传入文件名,如果文件名不存在就新建一个该名文件;
 * parmas model: 传入操作模式,目前只有MODE_PRIVATE这种模式可用,也是默认模式;
 */
 getSharedPreferences("login", MODE_PRIVATE);

/**
 * Activity类中获取,文件名默认为Activity类名
 *
 * parmas model: 传入操作模式,默认模式;
 */
 getPreferences(MODE_PRIVATE);

/**
 * PreferenceManager类中获取,默认使用应用程序包名作为文件名前缀
 *
 * parmas context: 传入所在上下文;
 */
 PreferenceManager.getDefaultSharedPreferences(this);

Ⅰ存储数据

/**
     * 存储数据
     */
    private void saveData(){

        // 获取SharedPreferences实例
        SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);

        // 获取Editor实例
        SharedPreferences.Editor editor = preferences.edit();

        // 获取数据
        String account = accountET.getText().toString();
        String password = passwordET.getText().toString();

        // 通过键值添加数据
        editor.putString("account", account);
        editor.putString("password", password);
        editor.putBoolean("isRemmber", true);

        // 提交数据
        editor.apply();
    }

Ⅱ读取数据

/**
     * 读取数据
     */
    private void readData(){

        // 获取SharedPreferences实例
        SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);

        // 读取数据
        String account = preferences.getString("account", "");
        String password = preferences.getString("password", "");
        Boolean isRemmber = preferences.getBoolean("isRemmber",false);

        // 控件赋值
        accountET.setText(account);
        passwordET.setText(password);
        remmberCB.setChecked(isRemmber);
    }

Ⅲ清空数据

/**
     * 清空数据
     */
    private void clearData(){

        // 获取SharedPreferences实例
        SharedPreferences preferences = getSharedPreferences("login", MODE_PRIVATE);

        // 获取Editor实例
        SharedPreferences.Editor editor = preferences.edit();

        // 清空数据
        editor.clear();
    }

Tips:如果使用SharedPreferences直接保存用户名、密码等重要数据是不靠谱的,至少得将这些数据按照一定规则加密之后再保存到文件中!

3、SQLite存储

可用于存储大量的复杂的关系型数据,


Ⅰ创建数据库
新建一个MyDataBaseHelper类继承自SQLiteOpenHelper,并重写onCreate和onUpgrade方法,调用MyDataBaseHelper类的构造函数即可创建一个dbHelper,通过getWritableDatabase方法就可以获取到数据库

/**
 * 创建数据库
 *
 * parmas context:上下文
 * parmas name:数据库名称
 * parmas factory:允许在查询数据时返回一个自定义的Cursor,一般传null
 * parmas version:数据库版本
 * return dbHelper:返回一个dbHelper实例对象,调用getWritableDatabase()方法就可以获取到数据库
 */
 MyDataBaseHelper dbHelper = new MyDataBaseHelper(this, "DataCache.db", null, 2);
 SQLiteDatabase db = dbHelper.getWritableDatabase();

Ⅱ更新数据库
直接调用创建数据库方法,传一个不同的数据库版本号会自动调MyDataBaseHelper类中的onUpgrade方法,在方法内更新数据库操作即可

/**
 * 更新数据库
 */
 MyDataBaseHelper dbHelper = new MyDataBaseHelper(this, "DataCache.db", null, 2);

Ⅲ创建表

/**
 * 创建表
 *
 * 1、获取可操作数据库
 * 2、调用execSQL方法执行SQL语句删除表
 */
 SQLiteDatabase db = dbHelper.getWritableDatabase();
 db.execSQL("create table Book (id integer primary key autoincrement, author text, price real, pages integer, name text)");

Ⅳ删除表

/**
 * 删除表
 *
 * 1、获取可操作数据库
 * 2、调用execSQL方法执行SQL语句删除表
 */
 SQLiteDatabase db = dbHelper.getWritableDatabase();
 db.execSQL("drop table if exists Book");

Ⅴ插入数据

/**
 * 插入数据
 * 
 * parmas table:要插入的表名
 * parmas nullColumnHack:空值自动赋值null,一般用不到直接传null就行
 * parmas factory:允许在查询数据时返回一个自定义的Cursor,一般传null
 * parmas values:要插入的数据实例对象
 */
 ContentValues values = new ContentValues();
 values.put("author", "Lee");
 values.put("price", 9.98);
 values.put("pages", 496);
 values.put("name", "How are you");

 SQLiteDatabase db = dbHelper.getWritableDatabase();
 db.insert("Book", null, values);

Ⅵ更新数据

/**
 * 更新数据
 *
 * parmas table:要插入的表名
 * parmas values:要更新的数据实例对象
 * parmas whereClause:SQL查询条件
 * parmas whereArgs:查询条件参数数组,依然顺序从数据取值赋给前面查询条件中的?占位符
 */
 ContentValues updateValue = new ContentValues();
 updateValue.put("price", 10.99);

 SQLiteDatabase db = dbHelper.getWritableDatabase();
 db.update("Book", updateValue, "name=?", new String[]{"How are you"});

Ⅶ删除数据

/**
 * 删除数据
 *
 * parmas table:指定删除数据的表名
 * parmas whereClause:指定查询条件
 * parmas whereArgs:为查询条件的占位符提供具体值
 */
 SQLiteDatabase db = dbHelper.getWritableDatabase();
 db.delete("Book", "pages > ?",new String[]{"500"});

Ⅷ查询数据

/**
 * 查询数据
 *
 * parmas table:指定查询的表名
 * parmas columns:指定查询的列名
 * parmas section:指定查询条件
 * parmas sectionArgs:为查询条件的占位符提供具体值
 * parmas groupBy:指定需要groupBy的列
 * parmas having:对groupBy的结果进一步约束
 * parmas orderBy:指定查询结果的排序方式
 * return cursor:返回一个可操作的cursor对象,操作cursor对象即可获取具体数据
 */
 SQLiteDatabase db = dbHelper.getWritableDatabase();
 Cursor cursor = db.query("Book",null, null, null, null, null, null);
上一篇下一篇

猜你喜欢

热点阅读