Adroid之SqliteDatabase學習筆記

Android之SqliteDatabase數據庫學習筆記

1.SqliteDatabase概述:

大家對sqlite數據庫應該是比較瞭解的,他是一個輕量級的數據庫,並且他只是一個嵌入式的數據庫引擎,專門適合於資源有限的設備(如手機、PAD等)上存儲適量的數據。那麼android爲我們提供了SqliteDatabase代表一個數據庫(底層就是一個數據庫文件),只要獲取到這個對象,我們就可以對數據庫進行操作和管理了。

2.先看看SqliteDatabase爲我們提供瞭如下打開靜態方法來打開一個文件對應的數據庫:

static SQLiteDatabase openDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打開path路徑文件所代表的Sqlite數據庫

static SQLiteDatabase openOrCreateDatabase(File file,SQLiteDatabase.CursorFactoryFactory) 打開或創建(如果不存在)file文件所代表的數據庫。

static SQLiteDatabase openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryFactory,int flags) 打開或創建(如果不存在)path路徑所代表的數據庫。

3.通過上面的靜態方法就可以獲取SQLiteDatabase實例了,在有了這個對象後,我們就可以通過如下的方法來操作數據庫了

execSQL(String sql, Object[] bindArgs):執行帶佔位符的SQL語句

sql:代表要執行的sql語句 例如查詢語句:select * from student where age = ?
bindArgs:佔位符的值,如上語句中age = ? 假如我們需要查詢年級爲20歲的,則我們可以寫上  
這個參數即可: new Object[]{10}

execSQL(String sql):執行SQL語句

insert(String table, String nullColumnHack, ContentValues values):
向指定的表中插入數據

table:表名
nullColumnHack:如果後面的values參數爲null或者不包含任何key-value對時這該參數  
有效,表示強行插入該數值
values:一行的記錄值

update(String table, ContentValues values, String whereClause, String[] whereArgs):更新指定表中的特定數據

table:表名
            values:想更新的值
            whereClause:滿足該參數子句的記錄將會被更新
            whereArgs:用於爲子句的佔位符傳入參數

delete(String table, String whereClause, String[] whereArgs):刪除指定表中的特定數據

    table:表名
    whereClause:滿足該參數子句的記錄將會被刪除
    whereArgs:用於爲子句的佔位符傳入參數

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy):對指定的數據表進行查詢

table:表名
colnums:要查詢出來的列名,相當於select語句select關鍵字後面的部分
selection:查詢條件子句,相當於select語句where關鍵字後面的部分,  
該子句中允許佔位符?
seletctionArgs:查詢子句selection的佔位符的參數
gropBy:用於控制分組,相當於select語句group by關鍵字後面的部分
having:用於對分組進行過濾。相當於select語句having關鍵字後面的部分
orderBy:用於對記錄進行排序,相當於select語句order by關鍵字後面的部分,  
如name desc 、age 
asc。  desc(表示降序,從大到小)asc(表示升序,從小到大)

query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):對指定的數據表執行查詢,limit參數控制最多查詢幾條記錄(用於控制分頁的參數)

limit:用於進行分頁。相當於select語句limit關鍵字後面的部分,如 2,5(表示從第3條數據開始  
查詢,查詢5條數據)

query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit):對指定的數據表執行查詢。其中第一個參數控制是否除去重複值

distinct:指定是否去除重複的記錄

rawQuery(String sql, String[] selectionArgs):執行帶佔位符的SQL語句。

sql:sql語句
selectionArgs:佔位符的參數

beginTransaction():開始事務

endTransaction():結束事務

4.如何創建數據庫和表

//創建數據庫,如果該文件下不存在數據庫就創建,存在就打開,
//getFilesDir()獲取的路徑是:/data/data/對應你的包名(com.itrealman.sqlitedatabase)/files
SqliteDatabase db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + “/” + DBNAME,null);

//創建person表
db.execSQL(“create table person(_id integer primary key autoincrement, perName varchar(20) not null,perAge int check(perAge >= 0 and perAge <= 150))”);

5.下面通過使用SQL語句來操作Sqlite數據庫

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.itrealman.contentprovide.MainActivity">

    <TextView
        android:id="@+id/mTvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="請輸入姓名:"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/mEdtName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mTvName"
        android:layout_marginTop="10dp" />

    <TextView
        android:id="@+id/mTvAge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mEdtName"
        android:layout_marginTop="20dp"
        android:text="請輸入年齡:"
        android:textSize="20sp" />

    <EditText
        android:id="@+id/mEdtAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mTvAge"
        android:layout_marginTop="10dp" />

    <LinearLayout
        android:id="@+id/mLin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mEdtAge"
        android:layout_marginTop="10dp"
        android:gravity="center">
        <Button
            android:id="@+id/mBtnCreate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="創建表" />

        <Button
            android:id="@+id/mBtnInsert"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="插入" />

        <Button
            android:id="@+id/mBtnDelete"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="刪除" />

        <Button
            android:id="@+id/mBtnUpdate"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="更新" />

        <Button
            android:id="@+id/mBtnQuery"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查詢" />

    </LinearLayout>

    <TextView
        android:id="@+id/mTvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/mLin"
        android:layout_marginTop="50dp"
        android:text="查詢的數據爲:"
        android:textSize="20sp" />
</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

        //數據庫對象
        private SQLiteDatabase db;
        //數據庫名
        public final String DBNAME = "test.db";
        //數據庫表名
        public final String TABLENAME = "person";
        private EditText mEdtName;
        private EditText mEdtAge;
        private TextView mTvResult;
        private Button mBtnInsert;
        private Button mBtnDelete;
        private Button mBtnUpdate;
        private Button mBtnQuery;
        private Button mBtnCreate;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
            event();
            //創建person表

        }

        /**
         * 初始化事件
         */
        private void event() {
            mBtnDelete.setOnClickListener(this);
            mBtnInsert.setOnClickListener(this);
            mBtnUpdate.setOnClickListener(this);
            mBtnQuery.setOnClickListener(this);
            mBtnCreate.setOnClickListener(this);

        }

        /**
         * 初始化控件
         */
        private void init() {
            //創建數據庫,如果該文件下不存在數據庫就創建,存在就打開,
            //getFilesDir()獲取的路徑是:/data/data/對應你的包名(com.itrealman.sqlitedatabase)/files
            db = SQLiteDatabase.openOrCreateDatabase(getFilesDir() + "/" + DBNAME, null);
            mBtnInsert = (Button) findViewById(R.id.mBtnInsert);
            mBtnDelete = (Button) findViewById(R.id.mBtnDelete);
            mBtnUpdate = (Button) findViewById(R.id.mBtnUpdate);
            mBtnQuery = (Button) findViewById(R.id.mBtnQuery);
            mBtnCreate = (Button)findViewById(R.id.mBtnCreate);
            mEdtAge = (EditText) findViewById(R.id.mEdtAge);
            mEdtName = (EditText) findViewById(R.id.mEdtName);
            mTvResult = (TextView)findViewById(R.id.mTvResult);
        }

        @Override
        public void onClick(View v) {
            String name = null;
            int age = 0;
            switch (v.getId()) {
                case R.id.mBtnDelete:
                    name = mEdtName.getText().toString().trim();
                    deleteData(name);
                    break;
                case R.id.mBtnUpdate:
                    name = mEdtName.getText().toString().trim();
                    age = Integer.parseInt(mEdtAge.getText().toString().trim());
                    updateData("newName", age, name);
                    break;
                case R.id.mBtnInsert:
                    name = mEdtName.getText().toString().trim();
                    age = Integer.parseInt(mEdtAge.getText().toString().trim());
                    insertData(name, age);
                    break;
                case R.id.mBtnQuery:
                    queryAllData();
                    break;
                case R.id.mBtnCreate:
                    createTable();
                    break;
            }
        }

        /**
         * 插入數據
         * @param name
         * @param age
         */
        private void insertData(String name, int age) {
            db.execSQL("insert into " + TABLENAME + "(name,age) values(?,?)", new Object[]{name, age});
            Toast.makeText(this, "插入數據", Toast.LENGTH_SHORT).show();
        }

        /**
         * 刪除數據
         * @param name
         */
        private void deleteData(String name) {
            db.execSQL("delete from " + TABLENAME + " where name =  ?", new Object[]{name});
            Toast.makeText(this, "刪除數據", Toast.LENGTH_SHORT).show();
        }

        /**
         * 更新數據
         * @param name 更新數據的名字
         * @param age 更新數據年齡
         * @param name1 需要跟新的條件
         */
        private void updateData(String name, int age, String name1) {
            db.execSQL("update " + TABLENAME + " set name = ? ,age = ? where name = ?", new Object[]{name, age, name1});
            Toast.makeText(this, "更新數據", Toast.LENGTH_SHORT).show();
        }

        /**
         * 查詢所有數據
         */
        private void queryAllData() {
            Cursor cursor = db.rawQuery("select * from " + TABLENAME,null);
            StringBuilder sb = new StringBuilder();
            sb.append("查詢的數據爲:");
            while (cursor.moveToNext()) {
                sb.append("name = " + cursor.getString(cursor.getColumnIndex("name"))).append("   age = " + cursor.getInt(cursor.getColumnIndex("age"))).append("    ");
            }
            mTvResult.setText(sb.toString());
        }

        /**
         * 創建表,如果表存在就不創建,這也是一個小細節,如果說不加if not exists語句,那麼
         * 這個表就只能創建一次,後面的每次創建都會導致程序崩潰,加上這條語句後,起碼創建
         * 表按鈕不會導致程序崩潰
         */
        private void createTable(){
            db.execSQL("create table if not exists " + TABLENAME + "(_id integer primary key autoincrement, name varchar(20) not null,age int check(age >= 0 and age <= 150))");
            Toast.makeText(this,"創建表",Toast.LENGTH_SHORT).show();
        }
        /**
         * 每次結束程序時關閉數據庫,防止內存泄露問題
         */
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if(db != null){
                db.close();
            }
        }
        }

上面的代碼都是採用都是使用SQL語句的形式對數據庫操作的,也許對於初學者來說會覺得這些SQL語句寫起來非常繁瑣,一不小心SQL語句就寫錯了,但是作爲一個程序員,這些基本的語句還是要掌握的。當然我們還有更方便的方法來對數據庫進行操作,爲了防止SQL語句一不留神就寫錯了,安卓直接爲我們提供針對表名的形式進行增刪改查操作,而通過這些方法,我們只需要傳遞對應的表名、查詢條件、值、參數等。

注意,初次啓動必須點擊一次創建表按鈕,或者爲了方便起見,可以把創建表語句放到onCreate方法中,每次初始化時讓其自動創建表即可。

配上效果圖吧,只做了簡單的操作 ,其他操作都一樣,只是沒做這些效果:

這裏寫圖片描述

ps:對應上面的代碼,是讓初學者掌握基本的SqliteDatabase的操作,平時在安卓中都不會使用這些代碼做基本操作,有關SqliteDatabase數據庫的封裝操作會在後面學習中講解。

發佈了58 篇原創文章 · 獲贊 19 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章