美文网首页APP & programandroid
Android中数据持久化技术

Android中数据持久化技术

作者: BlueSocks | 来源:发表于2023-01-30 16:08 被阅读0次

    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);
    

    相关文章

      网友评论

        本文标题:Android中数据持久化技术

        本文链接:https://www.haomeiwen.com/subject/zdjphdtx.html