数据存储学习笔记

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

推荐阅读更多精彩内容