Android持久化数据存储——File、SharedPreferences、SQLite

版权声明:转载请声明出处~ https://blog.csdn.net/march0000/article/details/80292960

Android的数据存储方式有三种,分别为File(文件)、SharedPreferences(键值对)、SQLite(轻量级数据库)。


一、文件存储:

    文件存储的使用直接上代码,代码均有详细注释,非常好理解~
package com.example.mjon.myapplication;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends AppCompatActivity {

    private EditText ed;

    private FileOutputStream fileOutputStream;
    private BufferedWriter bufferedWriter;

    private FileInputStream fileInputStream;
    private BufferedReader bufferedReader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ed = (EditText) findViewById(R.id.ed);
    }

    /**
     * 读入数据
     */
    @Override
    protected void onResume() {
        super.onResume();
        try {
            StringBuilder stringBuilder = new StringBuilder();  //用于存放取出的数据
            fileInputStream = openFileInput("data");  //通过openFileInput()打开文件,返回一个文件输入流对象
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));  //借助返回的文件输入流对象构建读入流对象,接着构建出读取缓冲对象
            String temp = "";  //用于临时保存每行读出的数据
            while ((temp = bufferedReader.readLine()) != null) {  //每读取一行,追加保存一次,直到读取到末尾
                stringBuilder.append(temp);
            }
            ed.setText(stringBuilder.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {  //如果读取缓冲对象有数据则关闭
                    bufferedReader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 写出数据
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        String temp = ed.getText().toString();
        try {
            fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);  //通过openFileOutput()打开或创建文件,返回文件输出流对象
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));  //借助返回的文件输出流对象构建出写出流对象,再借助写出流对象构建出写出缓冲对象
            bufferedWriter.write(temp);  //通过写出缓冲对象写出数据
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedWriter != null) {  //如果写出缓冲流中有数据则关闭
                    bufferedWriter.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

二、SharedPrederences(键值对):

    SharedPreferences使用键值对保存数据;

    获取SharedPreferences实例的三种方法:

            Context:getSharedPreferences("文件名",MODE_PRIVATE);

            Activity:getPreferences(MODE_PRIVATE);

            PreferenceManager:getDefaultSharedPreferences(Context);


    模式:

        MODE_PRIVATE

        MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE(安全性问题~~4.2版本开始已被废弃)

        MODE_MULTI_PROCESS(6.0版本开始已被废弃)


保存数据:SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();

读取数据:SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);

package com.example.mjon.myapplication;

import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText user;
    private EditText sex;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        user = (EditText) findViewById(R.id.user);
        sex = (EditText) findViewById(R.id.sex);
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(listener);
    }

    /**
     * 保存数据
     */
    View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.btn:
                    String users = user.getText().toString();
                    String sexs = sex.getText().toString();
                    SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();  //获取sp.editor实例,第一个参数为文件名,第二个参数为文件模式
                    editor.putString("username", users);  //使用put方法保存数据
                    editor.putString("sex", sexs);
                    editor.apply();  //提交
                    break;
                default:
                    break;
            }
        }

    };

    /**
     * 读取数据
     */
    @Override
    protected void onResume() {
        super.onResume();
        SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);  //获取sp实例,第一个参数为文件名,第二个参数为文件模式
        String user_temp = sp.getString("username", "");  //通过get方法获取数据
        String sex_temp = sp.getString("sex", "");
        user.setText(user_temp);
        sex.setText(sex_temp);
    }
}

三、SQLite:

Ⅰ、通过帮助类操作:

    ①创建数据库、创建表、添加表(升级数据库)

package com.example.mjon.myapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * 使用Android提供的帮助类,实现2+1( onCreate() + onUpgrade() + MyDatabaseHelper()构造器 )
 */
public class MyDatabaseHelper extends SQLiteOpenHelper {

    private Context mcontext;

    //建表
    private static final String CREATE_BOOK = "create table Book(" +
            "id integer primary key autoincrement," +
            "author text," +
            "price real," +
            "pages integer," +
            "name text)";
    
    private static final String CREATE_CATEGORY = "create table Category(" +
            "id integer primary key autoincrement," +
            "category_name text," +
            "category_code integer)";

    public MyDatabaseHelper(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);
        Log.d("OK", "创建成功");
    } 
    
    //添加表(先删再创,否则系统检查到已存在表则会报错,程序直接崩溃)
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("drop table if exists Book");//先删
        onCreate(sqLiteDatabase);//再创
    }
}


package com.example.mjon.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private MyDatabaseHelper myDatabaseHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);  //实例化对象(Context,Database_name,Cursor,version)
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myDatabaseHelper.getWritableDatabase();  //创建数据库+建表/添表(改变version值↑)
            }
        });
    }
}

    首先,创建一个继承与SQLiteOpenHelper的子类,实现2+1(onCreate() + onUpgrade() + MyDatabaseHelper()构造器 )。然后先定义一条建表的SQL语句,接着在onCreate()方法中通过sqLiteDatabase.execSQL()执行SQL语句;最后,在Activity中实例化SQLiteOpenHelper的子类,并传递三个参数,通过调用myDatabaseHelper.getWritableDatabase()方法对数据库进行正式操作。

    如果想添加表,就在SQLiteOpenHelper的子类中添加一条SQL建表语句,然后在onCreate()方法中添加sqLiteDatabase.execSQL()去执行SQL语句。!!!注意!!!,当你要添加表的时候,onCreate()方法会再次执行,而之前已经创建的表会再执行一次,但是我们之前已经创建了这张表,当再次执行这条SQL语句的时候,就会报错,程序就会直接崩溃。所以,我们应该在onUpgrade()方法中,先把原表删除,再调用onCreate()方法创表。然后在Activity中把SQLiteOpenHelper的子类的实例化对象的参数改下,就把版本号+1就行,这样新添的表就会得到创建。

    不过你会发现,当你执行onUpgrade()方法把表删除的时候,表中的数据也会没了。这时你就需要根据实际需求写一大段逻辑去控制了~~~因而,使用这种方法去操作数据库对我们并不是很友好,特别是对Java基础不太好的人来说。所以如果你想不使用一条SQL语句,又能简单操作数据库的话,那么直接翻到本文章末尾,直接看另外一篇博文~~


执行SQL语句要使用的对象有:.getWritableDatabase()

                                                  .getReadableDatabase()

②添加数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
ContentValues values = new ContentValues();  //实例化ContentVaules对象,用于存放数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values);  //执行插入,参数:表名,未指定添加数据的情况下给一些可为空的列自动赋值(就是存在一个列,然后你添加数据的时候没有给值,就默认给它个Null),ContentValues

③更新数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
ContentValues values = new ContentValues();  //实例化ContentValues对象,用于存放数据
values.put("price", 99.99);
db.update("Book", values, "author=?", new String[]{"Tom Davity"});  //执行更新,参数:表名,ContentValues,约束条件,约束条件的具体值

④删除数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
db.delete("Book", "pages>?", new String[]{"500"});  //执行删除,参数:表名,约束条件,约束条件的具体值

⑤查询数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();    //执行SQL语句要使用的对象
Cursor cursor = db.query("Book",null,null,null,null,null,null);  //执行查询
  //表名,查询的列名,约束条件,约束条件的具体值,需要Group by的列,having(进一步过滤),查询结果的排序方式


查询数据会返回一个Cursor(游标),然后移动游标取出数据~

if(cursor.moveToFirst()){
    do{
        String id = cursor.getString(cursor.getColumnIndex("id"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String price = cursor.getString(cursor.getColumnIndex("price"));
        String author = cursor.getString(cursor.getColumnIndex("author"));
        stringBuilder.append(id + ";" + name + ";" + price + ";" + author);
    }while(cursor.moveToNext());
}

Ⅱ、使用SQL操作数据库:

①添加数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", new String[]{"SQLite","Tom", "260", "25.30"});


②更新数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
db.execSQL("update Book set price = ? where pages = ?", new String[]{"88.88", "454"});


③删除数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
db.execSQL("delete from Book where pages > ?", new String[]{"300"});


④查询数据:

SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();  //执行SQL语句要使用的对象
    Cursor cursor = db.rawQuery("select * from Book", null);  //注意此处区别!!!使用的是rawQuery()不是query()
    if (cursor.moveToFirst()) {
        do {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            String pages = cursor.getString(cursor.getColumnIndex("pages"));
            String price = cursor.getString(cursor.getColumnIndex("price"));
            Log.e("OK", name + "," + author + "," + pages + "," + price);
        } while (cursor.moveToNext());
    }
}



以上SQLite数据库操作使用的是SQLiteDatabases和SQL方式来操作,适合掌握基本SQL语句的人。如果不想使用SQL语句操作数据库,可以使用LitePal开源Android数据库框架来对数据库进行操作,使用它则可以不用编写一行SQL语句,其使用方式要优于SQL语句(仅为个人观点,萝卜青菜各有所爱~)。

有兴趣的话可以单击此处查看另一篇博客:SQLite数据库操作之LitePal

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页