數(shù)據(jù)存儲(chǔ)學(xué)習(xí)筆記

Sqlite

使用
  1. 創(chuàng)建數(shù)據(jù)庫(kù)
  2. 創(chuàng)建表

Android為了讓我們能方便的管理數(shù)據(jù)庫(kù)椭盏,提供了一個(gè)SQLiteOpenHelper幫助類随静,借助這個(gè)類就可以非常簡(jiǎn)單地對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)基跑,所以我們需要先繼承 SQLiteOpenHelper 寫一個(gè) DatabaseHelper,代碼如下:

public class DatabaseHelper extends SQLiteOpenHelper{


    /**
     * 先把建表語句用字符串變量存起(也可以不存报辱,直接在函數(shù)里寫召噩,但這樣規(guī)范些)
     */
    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");
    }

    /**
     * 第一次創(chuàng)建數(shù)據(jù)庫(kù)時(shí)執(zhí)行父虑,如果數(shù)據(jù)庫(kù)已經(jīng)存在该酗,則不在執(zhí)行
     * @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();
    }

    /**
     * 此方法升級(jí)數(shù)據(jù)庫(kù)時(shí)會(huì)被回調(diào)
     * @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);
    }

    /**
     * 每次打開數(shù)據(jù)庫(kù)時(shí)都會(huì)執(zhí)行,也就是
     * DbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
     * @param db
     */
    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
        Log.d(LogUtil.TAG,"onOpen");
    }
}

上面的注釋寫的比較詳細(xì)士嚎,把每個(gè)方法都寫到了呜魄,相信應(yīng)該能看懂。

然后需要調(diào)用創(chuàng)建DatabaseHelper的實(shí)例莱衩,然后通過DatabaseHelper來獲得SQLiteDatabase實(shí)例爵嗅,我們就可以使用返回的SQLiteDatabase實(shí)例來操作數(shù)據(jù)庫(kù)了

//參數(shù)一:Context
//參數(shù)二:數(shù)據(jù)庫(kù)名稱
//參數(shù)三:允許我們?cè)诓樵償?shù)據(jù)時(shí)返回一個(gè)自定義的Cursor,一般用不到笨蚁,傳入null
//參數(shù)四:版本號(hào)
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,2);

//一般是getWritableDatabase()
mDb = mDbHelper.getWritableDatabase()   或  mDbHelper.getReadableDatabase()
  1. 升級(jí)數(shù)據(jù)庫(kù)
//修改版本號(hào)就行
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,3);  // 下次升級(jí)就把 3 改成更大的
  1. 增加數(shù)據(jù)(insert)
//用contentValues來保存你需要存儲(chǔ)的數(shù)據(jù)
ContentValues contentValues = new ContentValues();
contentValues.put("pages",pages);
contentValues.put("price",price);

//參數(shù)一:表名
//參數(shù)二:用于在未指定添加數(shù)據(jù)的情況下給某些可為空的列自動(dòng)賦值null睹晒,一般用不到,設(shè)為null
//參數(shù)三:ContentValues對(duì)象

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

//清空contentValues
contentValues.clear();
  • 查詢數(shù)據(jù)(select)

SQLiteDatabase中提供了一個(gè)query()方法用于對(duì)數(shù)據(jù)進(jìn)行查詢赚窃,這個(gè)方法參數(shù)比較復(fù)雜册招,最短的一個(gè)也需要傳7個(gè)參數(shù),界面來介紹一個(gè)7個(gè)參數(shù)的含義:

  1. table :指定查詢的表名
  2. columns :指定查詢的列名
  3. selection :指定where的約束條件
  4. selectionArgs :為where重的占位符提供具體的值
  5. groupBy :指定需要group by的列
  6. having :對(duì)group by后的結(jié)果進(jìn)一步約束
  7. orderBy :指定查詢結(jié)果的排列方式

以下是查詢數(shù)據(jù)的代碼片段:

mSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //創(chuàng)建或打開數(shù)據(jù)庫(kù)
                }

                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());
                }
            }
        });
  • 更新數(shù)據(jù)(update)

update()函數(shù)有4個(gè)參數(shù)勒极,和query()的大部分相同

  1. table:指定查詢的表名
  2. values:刷新的值
  3. whereClause:指定where的約束條件
  4. whereArgs:為where重的占位符提供具體的值

以下是更新數(shù)據(jù)的代碼片段:

mUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //創(chuàng)建或打開數(shù)據(jù)庫(kù)
                }

                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();
            }
        });
  • 刪除數(shù)據(jù)(delete)

delete()方法有3個(gè)參數(shù)是掰,和上面的一樣,就不細(xì)說了辱匿,代碼如下:

mDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mDb == null){
                    mDb = mDbHelper.getWritableDatabase();  //創(chuàng)建或打開數(shù)據(jù)庫(kù)
                }

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

                mDb.delete("Book","name = ?",new String[]{name});
            }
        });
問題:
  • getReadableDatabase() 和 getWritableDatabase() 的區(qū)別键痛?
  1. 兩個(gè)方法都可以創(chuàng)建或打開一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)(如果數(shù)據(jù)庫(kù)已存在則直接打開,否則創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù))匾七,并返回一個(gè)可對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫操作的對(duì)象
  2. 當(dāng)數(shù)據(jù)庫(kù)不可寫入時(shí)(比如磁盤滿了)絮短,getReadableDatabase()方法返回的對(duì)象將以只讀的方式去打開數(shù)據(jù)庫(kù),而getWritableDatabase()方法則將出現(xiàn)異常昨忆。

File

適用場(chǎng)景

文件存儲(chǔ)是Android中最基本的一種數(shù)據(jù)存儲(chǔ)方式丁频,它不對(duì)存儲(chǔ)的內(nèi)容進(jìn)行任何的格式化處理,所有的數(shù)據(jù)都是原封不動(dòng)的保存到文件中,所以它適合存儲(chǔ)一些簡(jiǎn)單的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)席里。

使用

保存數(shù)據(jù)

openFileOutput()方法可以指定兩種模式:
MODE_PRIVATE:是默認(rèn)的操作模式叔磷,表示當(dāng)指定同樣文件名的時(shí)候,所寫的內(nèi)容將會(huì)覆蓋原文件中的內(nèi)容奖磁。
MODE_APPEND:表示如果該文件已存在改基,就往里面追加內(nèi)容。

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();
                }
            }

        }
    }

讀取數(shù)據(jù)

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

不同于文件存儲(chǔ)咖为,Sharedpreference是使用鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)的秕狰,Sharedpreference還支持多種不同的數(shù)據(jù)類型存儲(chǔ),存的是String取出也是String躁染,存進(jìn)去的是整形鸣哀,讀取出來也是整形。

使用

獲取Sharedpreference對(duì)象

Android中提供了 3 種方法用于得到SharedPreferences對(duì)象

  1. Context類 中的 getSharedPreferences()方法
    此方法接收兩個(gè)參數(shù):
  • 第一個(gè)參數(shù)用于指定Sharedpreference的名稱褐啡,如果指定的文件不存在則會(huì)創(chuàng)建一個(gè)

  • 第二個(gè)用于指定操作模式诺舔,目前只有
    MODE_PRIVATE 這一模式可選鳖昌,是默認(rèn)的模式备畦,和直接傳入 0 的效果一樣,表示只有當(dāng)前的應(yīng)用程序才可以對(duì)這個(gè)Sharedpreference文件進(jìn)行讀寫

  1. Activity類 中的 getPreferences() 方法
    方法1 類似许昨,不過只接收一個(gè)操作模式參數(shù)懂盐,因?yàn)槭褂眠@個(gè)方法時(shí)會(huì)自動(dòng)將當(dāng)前活動(dòng)的類名作為 Sharedpreference 的文件名

  2. PreferenceManager 類 中的
    getDefaultSharePreferences() 方法

使用步驟

保存數(shù)據(jù):

(1)、獲取Sharedpreference對(duì)象

(2)糕档、調(diào)用Sharedpreference對(duì)象的 edit()方法來獲取一個(gè) Sharedpreference.Editor對(duì)象莉恼。

(3)、向Sharedpreference.Editor對(duì)象中添加數(shù)據(jù)速那,比如putBoolean()俐银、putString()方法等等

(4)、調(diào)用apply()方法將添加的數(shù)據(jù)提交端仰,從而完成數(shù)據(jù)存儲(chǔ)操作

示例代碼:

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

取出數(shù)據(jù):

(1)捶惜、獲取Sharedpreference對(duì)象

(2)、調(diào)用Sharedpreference對(duì)象的 getString()等方法獲取數(shù)據(jù)

示例代碼:

SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
                mTv_Name.setText(preferences.getString("name",""));
                mTv_Age.setText(preferences.getString("age",""));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荔烧,一起剝皮案震驚了整個(gè)濱河市吱七,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹤竭,老刑警劉巖踊餐,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臀稚,居然都是意外死亡吝岭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窜管,“玉大人酒觅,你說我怎么就攤上這事∥⒎澹” “怎么了舷丹?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜓肆。 經(jīng)常有香客問我颜凯,道長(zhǎng),這世上最難降的妖魔是什么仗扬? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任症概,我火速辦了婚禮,結(jié)果婚禮上早芭,老公的妹妹穿的比我還像新娘彼城。我一直安慰自己,他們只是感情好退个,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布募壕。 她就那樣靜靜地躺著,像睡著了一般语盈。 火紅的嫁衣襯著肌膚如雪舱馅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天刀荒,我揣著相機(jī)與錄音代嗤,去河邊找鬼。 笑死缠借,一個(gè)胖子當(dāng)著我的面吹牛干毅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泼返,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼硝逢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了符隙?” 一聲冷哼從身側(cè)響起趴捅,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霹疫,沒想到半個(gè)月后拱绑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽蝎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年猎拨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膀藐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡红省,死狀恐怖额各,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吧恃,我是刑警寧澤虾啦,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站痕寓,受9級(jí)特大地震影響傲醉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呻率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一硬毕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧礼仗,春花似錦吐咳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卢厂,卻和暖如春乾蓬,著一層夾襖步出監(jiān)牢的瞬間惠啄,已是汗流浹背慎恒。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撵渡,地道東北人融柬。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像趋距,于是被迫代替她去往敵國(guó)和親粒氧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容