【Android】sqlite探索

參考郭霖大大的《第一行代碼》

一開始先了解數據庫的建立和增刪改查就可以了,不要分散重點,學會了再學下一個
實現效果:
點兩下插入數據,然後點查詢,會出現四條數據,兩本書的信息(數據隨便寫的)
這裏寫圖片描述

點擊更新數據會將所有書名爲《純粹理性批判》的價格改爲38(再點一下查詢)
這裏寫圖片描述

點擊刪除數據,會把所有頁數超過500的書刪掉,也就是郭霖大大的《第一行代碼》
這裏寫圖片描述

創建一個MySQLiteOpenHelper 類繼承SQLiteOpenHelper,用於執行 數據庫 的創建和更新
CreateTableSentence 是建表語句,想象一個名爲book的表格

id name author price pages
1
2
3
4
名稱,作者,價格,頁數
primary key 主鍵
autoincrement 自增長
把建表語句放入execSQL函數裏,就建立了一張表(看代碼)

class MySQLiteOpenHelper extends SQLiteOpenHelper{

    private Context mContext;

    private String CreateTableSentence ="create table book ("
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "pages integer, "
            + "name text)";

    MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;

    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        sqLiteDatabase.execSQL(CreateTableSentence);//執行建表語句
        Toast.makeText(mContext,"創建表格book",Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        sqLiteDatabase.execSQL("drop table if exists book");
        onCreate(sqLiteDatabase);
        Toast.makeText(mContext,"更新數據庫",Toast.LENGTH_SHORT).show();
    }

}

定義了5個按鈕分別做相關的操作,一個文本用於顯示book表中的信息
定義三個ContentValues用來存儲數據(名起得長用來學英語),ContentValues有點像Map< String ,Object >,不過網上查了一下說不能存儲對象,只能存儲簡單的數據類型,如int,string之類的

public class MainActivity extends Activity implements View.OnClickListener{

    private MySQLiteOpenHelper mMySQLiteOpenHelper;
    private ContentValues mCritiqueOfPureReasonContentValues;//純粹理性批判
    private ContentValues mTheFirstLineOfCodeContentValues;//第一行代碼
    private ContentValues mUpdateCritiqueOfPureReasonPriceContentValues;//升級純粹理性批判價格

//一堆按鈕
    private Button mCreateDatabaseButton;
    private Button mAddDataButton;
    private Button mUpdateButton;
    private Button mDeleteButton;
    private Button mQueryButton;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initData();
        initEvent();

    }

}

下面的初始化基本上都沒什麼,稍微注意一下初始化數據,主要部分是在後面按鈕的點擊事件


    private void initView(){

        mCreateDatabaseButton=findViewById(R.id.id_button_create_database);
        mAddDataButton=findViewById(R.id.id_button_add_data);
        mUpdateButton=findViewById(R.id.id_button_update);
        mDeleteButton=findViewById(R.id.id_button_delete);
        mQueryButton=findViewById(R.id.id_button_query);
        textView=findViewById(R.id.id_text);

    }

    private void initData(){

        mCreateDatabaseButton.setText("創建數據庫");

        mAddDataButton.setText("插入數據");
        mDeleteButton.setText("刪除數據");
        mUpdateButton.setText("更新數據");
        mQueryButton.setText("查詢數據");

        mMySQLiteOpenHelper =new MySQLiteOpenHelper(this,"BookStore.db",null,2);//硬盤中的文件名

        //用於插入數據,兩本書的信息
        mCritiqueOfPureReasonContentValues =new ContentValues();

        mCritiqueOfPureReasonContentValues.put("name","《純粹理性批判》");
        mCritiqueOfPureReasonContentValues.put("author","康德");
        mCritiqueOfPureReasonContentValues.put("price",36.4);
        mCritiqueOfPureReasonContentValues.put("pages",485);

        mTheFirstLineOfCodeContentValues =new ContentValues();
        mTheFirstLineOfCodeContentValues.put("name","《第一行代碼》");
        mTheFirstLineOfCodeContentValues.put("author","郭霖");
        mTheFirstLineOfCodeContentValues.put("price",66.4);
        mTheFirstLineOfCodeContentValues.put("pages",585);

        //用於更新數據,把純粹理性批判的價格改爲38
        mUpdateCritiqueOfPureReasonPriceContentValues=new ContentValues();
        mUpdateCritiqueOfPureReasonPriceContentValues.put("price",38);

    }

    private void initEvent(){

        mCreateDatabaseButton.setOnClickListener(this);
        mAddDataButton.setOnClickListener(this);
        mUpdateButton.setOnClickListener(this);
        mDeleteButton.setOnClickListener(this);
        mQueryButton.setOnClickListener(this);

    }

mSQLiteDatabase是數據庫使用getWritableDatabase創建或者打開數據庫時返回的一個可對數據庫操作的對象,我們使用這個對象對數據庫進行增刪改查
增刪改就不說了,查詢時使用query方法,可以指定相關的行和列,這裏傳入null,然後返回所有book表的數據到mCursor中,再用循環取出來,顯示到textView中(光看文字看不懂,請結合看代碼看,熟練使用Ctrl鍵+F鍵)


    @Override
    public void onClick(View view) {

        SQLiteDatabase mSQLiteDatabase;//在點擊事件中對數據進行操作

        switch (view.getId()){

            case R.id.id_button_create_database:

                mMySQLiteOpenHelper.getWritableDatabase();
                break;

            case R.id.id_button_add_data:

                mSQLiteDatabase = mMySQLiteOpenHelper.getWritableDatabase();
                mSQLiteDatabase.insert("book",null, mCritiqueOfPureReasonContentValues);//第一行
                mSQLiteDatabase.insert("book",null, mTheFirstLineOfCodeContentValues);//第二行
                break;

            case R.id.id_button_delete:

                mSQLiteDatabase = mMySQLiteOpenHelper.getWritableDatabase();
                mSQLiteDatabase.delete("book","pages>?",new String[]{"500"});//刪除頁數大於500的行

                break;

            case R.id.id_button_update:

                mSQLiteDatabase = mMySQLiteOpenHelper.getWritableDatabase();

                //選擇book表中name爲《純粹理性批判》的所有行更新
                mSQLiteDatabase.update("book",
                                mUpdateCritiqueOfPureReasonPriceContentValues,"name=?",new String[]{"《純粹理性批判》"});
                break;

            case R.id.id_button_query:

                mSQLiteDatabase = mMySQLiteOpenHelper.getWritableDatabase();
                Cursor mCursor= mSQLiteDatabase.query("book",null,null,null,null,null,null);//獲取book表中的所有數據
                String textString="";
                if (mCursor.moveToFirst()){
                    while (true){

                        String name=mCursor.getString(mCursor.getColumnIndex("name"));
                        String author=mCursor.getString(mCursor.getColumnIndex("author"));
                        int pages=mCursor.getInt(mCursor.getColumnIndex("pages"));
                        double price=mCursor.getDouble(mCursor.getColumnIndex("price"));
                        textString=textString+"書名:"+name+",作者:"+author+",頁數:"+pages+",價格:"+price+"\n";//追加到文本後

                        if (!mCursor.moveToNext())break;//移動失敗結束循環

                    }
                }
                mCursor.close();
                textView.setText(textString);
                break;
        }

    }

增加一個事務功能


public class MainActivity extends Activity implements View.OnClickListener{

    ……
    private Button mReplaceButton;

    private void initView(){
        ……
        mReplaceButton=findViewById(R.id.id_button_replace);

    }

    private void initData(){

        ……
        mReplaceButton.setText("替換全部數據(事務)");
    }

    private void initEvent(){

        ……
        mReplaceButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {

        SQLiteDatabase mSQLiteDatabase;//在點擊事件中對數據進行操作

        switch (view.getId()){

            ……
            case R.id.id_button_replace:

                mSQLiteDatabase=mMySQLiteOpenHelper.getWritableDatabase();
                mSQLiteDatabase.beginTransaction();
                try {
                    mSQLiteDatabase.delete("book",null,null);
                    mSQLiteDatabase.insert("book",null, mCritiqueOfPureReasonContentValues);
                    mSQLiteDatabase.setTransactionSuccessful();

                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    mSQLiteDatabase.endTransaction();
                }
                break;

        }

    }

}

如果在刪除過程中出現異常,則事務不會成功,刪除操作會撤回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章