数据存储学习笔记

Sqlite

使用
  1. 创建数据库
  2. 创建表

Android为了让我们能方便的管理数据库,提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级,所以我们需要先继承 SQLiteOpenHelper 写一个 DatabaseHelper,代码如下:

public class DatabaseHelper 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 DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mContext = context;
        Log.d(LogUtil.TAG,"DatabaseHelper");
    }

    /**
     * 第一次创建数据库时执行,如果数据库已经存在,则不在执行
     * @param sqLiteDatabase
     */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(CREATE_BOOK);
        sqLiteDatabase.execSQL(CREATE_CATEGORY);

        Log.d(LogUtil.TAG,"onCreate");
        Toast.makeText(mContext,"Created succeded",Toast.LENGTH_SHORT).show();
    }

    /**
     * 此方法升级数据库时会被回调
     * @param sqLiteDatabase
     * @param i
     * @param i1
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        Log.d(LogUtil.TAG,"onUpgrade");

        sqLiteDatabase.execSQL("drop table if exists Book");
        sqLiteDatabase.execSQL("drop table if exists Category");
        onCreate(sqLiteDatabase);
    }

    /**
     * 每次打开数据库时都会执行,也就是
     * DbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
     * @param db
     */
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.d(LogUtil.TAG,"onOpen");
    }
}

上面的注释写的比较详细,把每个方法都写到了,相信应该能看懂。

然后需要调用创建DatabaseHelper的实例,然后通过DatabaseHelper来获得SQLiteDatabase实例,我们就可以使用返回的SQLiteDatabase实例来操作数据库了

//参数一:Context
//参数二:数据库名称
//参数三:允许我们在查询数据时返回一个自定义的Cursor,一般用不到,传入null
//参数四:版本号
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,2);

//一般是getWritableDatabase()
mDb = mDbHelper.getWritableDatabase()   或  mDbHelper.getReadableDatabase()
  1. 升级数据库
//修改版本号就行
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,3);  // 下次升级就把 3 改成更大的
  1. 增加数据(insert)
//用contentValues来保存你需要存储的数据
ContentValues contentValues = new ContentValues();
contentValues.put("pages",pages);
contentValues.put("price",price);

//参数一:表名
//参数二:用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般用不到,设为null
//参数三:ContentValues对象

mDb.insert("Book",null,contentValues);

//清空contentValues
contentValues.clear();
  • 查询数据(select)

SQLiteDatabase中提供了一个query()方法用于对数据进行查询,这个方法参数比较复杂,最短的一个也需要传7个参数,界面来介绍一个7个参数的含义:

  1. table :指定查询的表名
  2. columns :指定查询的列名
  3. selection :指定where的约束条件
  4. selectionArgs :为where重的占位符提供具体的值
  5. groupBy :指定需要group by的列
  6. having :对group by后的结果进一步约束
  7. orderBy :指定查询结果的排列方式

以下是查询数据的代码片段:

mSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //创建或打开数据库
                }

                name = mEdit_Name.getText().toString();

                Cursor cursor = mDb.query("Book",null,"name = ?",new String[]{name},null,null,null);
                if (cursor.moveToFirst()){
                    do {
                        name = cursor.getString(cursor.getColumnIndex("name"));
                        author = cursor.getString(cursor.getColumnIndex("author"));
                        pages = cursor.getString(cursor.getColumnIndex("pages"));
                        price = cursor.getString(cursor.getColumnIndex("price"));

                        mTv_Name.setText(name);
                        mTv_Author.setText(author);
                        mTv_Pages.setText(pages);
                        mTv_Price.setText(price);

                    }while (cursor.moveToNext());
                }
            }
        });
  • 更新数据(update)

update()函数有4个参数,和query()的大部分相同

  1. table:指定查询的表名
  2. values:刷新的值
  3. whereClause:指定where的约束条件
  4. whereArgs:为where重的占位符提供具体的值

以下是更新数据的代码片段:

mUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //创建或打开数据库
                }

                name = mEdit_Name.getText().toString();
                author = mEdit_Author.getText().toString();
                pages = mEdit_Pages.getText().toString();
                price = mEdit_Price.getText().toString();

                if (!"".equals(author))contentValues.put("author",author);
                if (!"".equals(pages))contentValues.put("pages",pages);
                if (!"".equals(price))contentValues.put("price",price);

                mDb.update("Book",contentValues,"name = ?",new String[]{name});

                contentValues.clear();
            }
        });
  • 删除数据(delete)

delete()方法有3个参数,和上面的一样,就不细说了,代码如下:

mDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //创建或打开数据库
                }

                name = mEdit_Name.getText().toString();

                mDb.delete("Book","name = ?",new String[]{name});
            }
        });
问题:
  • getReadableDatabase() 和 getWritableDatabase() 的区别?
  1. 两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象
  2. 当数据库不可写入时(比如磁盘满了),getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。

File

适用场景

文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有的数据都是原封不动的保存到文件中,所以它适合存储一些简单的文本数据或二进制数据

使用

保存数据

openFileOutput()方法可以指定两种模式:
MODE_PRIVATE:是默认的操作模式,表示当指定同样文件名的时候,所写的内容将会覆盖原文件中的内容。
MODE_APPEND:表示如果该文件已存在,就往里面追加内容。

private void sava(String inputText){
        FileOutputStream out = null;
        BufferedWriter writer = null;

        try {

            out = openFileOutput("data", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            if (writer != null){
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }

读取数据

private String load(){
        FileInputStream input = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();

        try {
            input = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(input));
            String line = "";
            while ((line = reader.readLine()) != null){
                content.append(line);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return content.toString();
    }

Sharedpreference

不同于文件存储,Sharedpreference是使用键值对的方式来存储数据的,Sharedpreference还支持多种不同的数据类型存储,存的是String取出也是String,存进去的是整形,读取出来也是整形。

使用

获取Sharedpreference对象

Android中提供了 3 种方法用于得到SharedPreferences对象

  1. Context类 中的 getSharedPreferences()方法
    此方法接收两个参数:
  • 第一个参数用于指定Sharedpreference的名称,如果指定的文件不存在则会创建一个

  • 第二个用于指定操作模式,目前只有
    MODE_PRIVATE 这一模式可选,是默认的模式,和直接传入 0 的效果一样,表示只有当前的应用程序才可以对这个Sharedpreference文件进行读写

  1. Activity类 中的 getPreferences() 方法
    方法1 类似,不过只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 Sharedpreference 的文件名

  2. PreferenceManager 类 中的
    getDefaultSharePreferences() 方法

使用步骤

保存数据:

(1)、获取Sharedpreference对象

(2)、调用Sharedpreference对象的 edit()方法来获取一个 Sharedpreference.Editor对象

(3)、向Sharedpreference.Editor对象中添加数据,比如putBoolean()putString()方法等等

(4)、调用apply()方法将添加的数据提交,从而完成数据存储操作

示例代码:

SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
                editor.putString("name",mEdit_Name.getText().toString());
                editor.putString("age",mEdit_Age.getText().toString());
                editor.apply();

取出数据:

(1)、获取Sharedpreference对象

(2)、调用Sharedpreference对象的 getString()等方法获取数据

示例代码:

SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
                mTv_Name.setText(preferences.getString("name",""));
                mTv_Age.setText(preferences.getString("age",""));

你可能感兴趣的:(数据存储学习笔记)