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的使用比较简单,也是最普遍的使用方式.数据库的使用,需要对数据库操作语句有一定的熟悉和了解.文件存取的方式步骤较为复杂,使用的频度也最低.

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

你可能感兴趣的:(Andoid数据持久化的方式)