Andoid数据持久化的方式

Andoid数据持久化的方式有3种:文件存储,偏好设置(SharedPreferences)存储和数据库存储.其中文件存储主要是存储一些简单数据和应用预置数据,如一些默认文字和语句等.偏好设置用于用户的个性化定制,如账号,密码和选项等.强大的数据库用于存储赋值的数据或者是数量比较大型的数据.三种存储方式,都存储在App文件包的data文件夹下,都涉及到读/存双向处理的知识.下面详细介绍各自的使用方式.

文件存储

和java语言类似,文件的读/写都是采用文件流的方式来实现,为了更好的适配,Android中又对java的文件流进行了封装.
由于读和写具有对称性,下面以写为例介绍一下具体实现.首先通过openFileInput方法传入文件名aa,创建文件.然后通过返回的FileInputStream实例对象,创建InputStreamReader,最后可以创建BufferedReader对象用于文件的连续存取.由于用openFileInput打开文件,有可能发生IO错误,所以需要try语句来处理.
<1>写入文件

public void save(String inputText) {
        FileOutputStream fileOutputStream = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);
            bufferedWriter = new BufferedWriter(outputStreamWriter);
            bufferedWriter.write(inputText);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                    Toast.makeText(this, "Storing succeeded", Toast.LENGTH_SHORT).show();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

<2>读取文件

public String load(){
        FileInputStream fileInputStream = null;
        BufferedReader bufferedReader = null;
        StringBuilder stringBuilder = new StringBuilder();
        try {
            fileInputStream = openFileInput("data");
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)) ;
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                }catch (IOException e){
                    e.printStackTrace();
                }

            }
        }
        return stringBuilder.toString();
    }
偏好设置SharedPreferences

用SharedPreferences存储数据,是三种中最简单的方式,可以用3中不同的方式来获取.
<1>Context类中的getSharedPreferences()方法.该方法接收的第一个参数为为文件名,第二个参数为文件读取方式.

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
                editor.putString("name", "Tom");
                editor.putInt("age", 28);
                editor.putBoolean("married", false);
                editor.commit();
            }
        });

<2>Activity类中的getPreferences()方法,会自动以当前类名创建文件,使用方式参照1.
<3>PreferenceManager类中的getDefaultSharedPreferences,会以当前包名创建文件,在MainActivity中具体使用方式如下.

        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
        Button loginButton = (Button)findViewById(R.id.login_button);
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences.Editor editor = pref.edit();
                if (rememberPass.isChecked()) {
                    editor.putBoolean("remember_pass", true);
                } else {
                    editor.clear();
                }
                editor.apply();
            }
        });
数据库存储

Andorid中内置了SQLite3,我们可以向书写数据库语句一样,创建数据库中的表,在表中对数据进行C(create)R(retrieve)U(update)D(delete)操作.
在Android中可以使用SQLiteOpenHelper的抽象类来实现具体操作.首先需要新建继承自SQLiteOpenHelper的实体类,需要重写onCreate和onUpgrade两个方法,实现数据库的创建和更新.下面实现MyOpenHelper类,其中构造方法中的最后一个参数version表示创建数据库时的版本,当更新数字时,就会调用重写的onUpgrade方法.

public class MyOpenHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book (" +
            "id integer primary key autoincrement," +
            "author text," +
            "price real," +
            "pages integer," +
            "name text)";

    public static final String CREATE_CATEGORY = "create table Category (" +
            "id integer primary key autoincrement," +
            "category_name text," +
            "category_code integer)";

    private Context mContext;
    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(CREATE_BOOK);
        sqLiteDatabase.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext,"create success", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);
        Toast.makeText(mContext,"update success", Toast.LENGTH_SHORT).show();
    }
}

使用MyOpenHelper类.

//创建BookStore.db数据库
MyOpenHelper  myOpenHelperSecond = new MyOpenHelper(this, "BookStore.db", null, 1);
        Button btn = (Button)findViewById(R.id.create_database);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db = myOpenHelper.getWritableDatabase();
            }
        });
//添加数据
btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //MainActivity.this 是否和 MainActivity.class 一样?
                myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 3);
                SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();

                ContentValues values = new ContentValues();
                values.put("author", "David");
                values.put("price", 16.10);
                values.put("pages", 200);
                values.put("name", "cocopod");
                db.insert("Book", null, values);
                values.clear();

                values.put("author", "David2");
                values.put("price", 16.11);
                values.put("pages", 201);
                values.put("name", "cocopod2");
                db.insert("Book2", null, values);

            }
        });
//更新数据
btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //MainActivity.this 是否和 MainActivity.class 一样?
                myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 4);
                SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();

                ContentValues values = new ContentValues();
                values.put("author", "David");
                values.put("price", 15.99);
                db.update("Book", values, "name = ?", new String[]{"cocopod"});

            }
        });
//删除数据
btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //MainActivity.this 是否和 MainActivity.class 一样?
                myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 5);
                SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
                db.delete("Book", "pages > ?", new String[]{"500"});
            }
        });
//查询数据
btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //MainActivity.this 是否和 MainActivity.class 一样?
                myOpenHelperSecond = new MyOpenHelper(MainActivity.this, "BookStore.db", null, 3);
                SQLiteDatabase db = myOpenHelperSecond.getWritableDatabase();
                Cursor cursor = db.query("Book", null, null, null, null, null,null, null);
                if (cursor.moveToFirst()){
                    do {
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        Float price = cursor.getFloat(cursor.getColumnIndex("price"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));

                        Log.e("MainActivity", "author = "+author + "price = "+price.toString()
                                + "pages = "+pages
                                + "name = " + name);
                    }while (cursor.moveToNext());
                }
                cursor.close();
            }
        });

对数据库的实现,有使用起来更方便的开源工程LitePal,详细请移步github.

总结

数据持久化存储的3中方式,本质上都是将数据保存在本地的App中,都有各自的使用场景.其中SharedPreferences的使用比较简单,也是最普遍的使用方式.数据库的使用,需要对数据库操作语句有一定的熟悉和了解.文件存取的方式步骤较为复杂,使用的频度也最低.

喜欢和关注都是对我的鼓励和支持~

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

推荐阅读更多精彩内容