Android中数据持久化

本人专职是iOS开发,利用业余时间刚开始学习Android开发,学习资料就是郭霖大神的《第一行代码》,这篇文章算是读书笔记,分享出来一是帮助自己记忆,二是可以方便别人查阅,希望各位大佬不吝赐教!


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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345