美文网首页
数据存储学习笔记

数据存储学习笔记

作者: JeffMei | 来源:发表于2017-08-02 15:02 被阅读0次

    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",""));
    

    相关文章

      网友评论

          本文标题:数据存储学习笔记

          本文链接:https://www.haomeiwen.com/subject/tmbjlxtx.html