Android SQL 學習記錄

 

Android應用處理數據的方法

 

幾種數據存儲方式

a. SQLiteDB

在Android中我們使用SQLiteDB作爲數據庫,它具有以下特點:

  • Light : 輕量級
  • Standard : 標準化
  • Open-Src : 開源
  • No Server : 沒有服務器
  • Single-tier : 單層的  
  • Loose-type : 寬鬆類型
  • App-process : 在應用程序的進程中進行調用

下面我們挑幾個SQLiteDB的特性進行介紹。

Standard :SQLite是標準兼容的,也就是說SQL語句在SQLite均可使用

Single-tier :是指SQLite是單層的,也就是不含中間層,不需要通過什麼工具訪問數據庫,可以直接訪問。

No Server :SQLite是自包含的數據庫,當你創建的數據庫的時候,這些數據會保存在應用中的某一個文件中

Loose-type :簡單來說就是同一列中的數據可以是不同類型

b. Internal Storage (內部存儲)

用於存放應用程序的相關數據,在內部存儲中,每個應用對應一個文件夾,並且每個文件之間不可相互訪問,應用程序只能訪問與之對應的文件。

c. External Storage(外部存儲)

一般用於存放較大的文件,如圖片、音頻等,在外部存儲中的文件,每個應用程序均可訪問。

d. shared preferences (偏好設置)

用於存儲用戶的偏好信息,用key-value的形式存儲

e. remote storage (網絡存儲)

  •  

SQLite文件

a. 存放路徑:/data/data/<package-name>/databases

SQLite文件放置於Android根目錄下的data/data中,以應用程序的名稱作爲包名的文件夾中

b. SQLite文件是私有的,也就是說,僅該程序可訪問,而其他程序不可訪問。

Tips : 一般較大的文件不能直接放在Database中,而應該將大文件的URL放在Database中。

c. 創建數據庫

1. 使用代碼的方式進行創建(code)

  • android.database.sqlite.SQLiteData      ---在代碼中直接使用 
SQLiteDatabase sqlDB=openOrCreateDatabase("test.db",mode:SQLiteDatabase.CREATE_IF_NECESSARY,null)
sqlDB.execSQL("CREATE Table tb1(id INTERGER PRIMARY KEY, name TEXT,phone LONG)");
sqlDB.close();

       例如在上述代碼中,我們首先創建一個SQLiteDatebase對象,並對數據庫的name,mode以及factory進行賦值。

然後調用execSQL方法執行數據庫語句來創建表。

               SQLiteDatabase的具體使用方法參考開發文檔: 

                    https://developer.android.google.cn/reference/kotlin/android/database/sqlite/SQLiteDatabase?hl=en

  • SQLiteOpenHelper

android.database.sqlite.SQLiteData一般直接在Activity中就可直接使用,但是這樣會導致代碼的耦合度過高,爲了降低掉嗎的耦合度,我們採用SQLiteOpenHelper來進行數據庫的相關操作。

值得注意的是,SQLiteOpenHelper是一個抽象類,因此我們在使用的使用需要實現該抽象類,具體的使用方法如下。

在這裏我們爲了更好的展示,將代碼分爲兩個部分。

public class MainActivity extends AppCompatActivity {

    ...code...
    
    /*在OnCreate直接調用我們所實現的SQLiteOpenHelper類進行數據的插入
    (在這裏我們將其命名爲Datahelper)
    */
    @Override
    protected void onCreate() {

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){....});
        Datahelper dh = new DataHelper(); //創建我們實現的Datahelper對象
        dh.insert(te.text());  //假設有個名爲te的控件,我們獲取其中的text並通過Datahelper對象將其插入到數據庫中
}
/*實現SQLiteOpenHelper抽象類*/

public class DataHelper{
    SQLiteDatabase sqlDB;  //創建一個數據庫對象(在android.database.sqlite.SQLiteData部分我們已經做了介紹)
    OpenHelper oh;
    private final static String dataName; //定義數據庫的名稱
    public DataHelper(){
        oh = new OpenHelper(this.Context); //用於創建OpenHelper類對象,其中this.Context表示獲取當前的上下文對象
        sqlDB = oh.getWritableDatabase(); //定義爲可寫的
    }

    insert() //實現數據庫的插入方法
    {
        sqlDB.insert();
    }

    getTable() //實現數據庫獲取表的方法
    {
        SQLiteDatabase sqlDB = openorCreate
    }

    /*實現SQLiteHelper抽象類
        *實現SQLiteHelper類中的兩個方法
        *onpenHelper方法
        *onCreate方法
    */

    private static class Openhelper extends SQLiteHelper 
    {
        public OpenHelper (Context context){
            super(context,dataName,.....);
        }

        void onCreate(SQLiteDatabase db){
            db.execSQL("create table...");
        }
    }
}

2. 使用Linux shell進行創建

  • 使用cmd命令打開adb.exe
  • 輸入adb shell 進入android 的 linux 命令操作方式

  • 切換到應用對應的存放數據庫的文件路徑下(這裏博主創建的項目爲myapp)

  • 輸入sqlite3  <database-name>   例如:sqlite3 test.db //即創建一個名爲 test 的數據庫

  • 接下來就可以進行創建表格插入數據等操作,在這裏就不一一贅述了
  • 最後使用 exit 可退出Linux Shell

d. 存儲/獲取數據庫中的信息

  • Insert,delete,Update

我們需要先創建一個數據庫,根據上面的介紹,我們可以採用兩種方式進行創建,由於上面已經給出了實現方法,在這裏博主就不重複創建,直接用我們已經創建好的database進行增刪改操作。

已有的數據庫結構 :

  1. <database> - test.db   
  2. <table-name> - tb1
  3. <column-name> - name , phone

在Activity類中,我們用一個按鈕來觸發數據庫的插入操作,下列這段代碼放在OnCreate方法中。

        TextView tv = (TextView)  findViewById(R.id.text1);

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(){
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("INSERT");
                SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
                sqlDB.execSQL("INSERT INTO tb1(name,phone) values('name1','123123123123')");
                sqlDB.close();
            }
        });

運行完程序,我們點擊按鈕後,重新回到命令行窗口,查找我們數據庫中已有表tb1中的數據,發現該記錄已經成功寫入。

接下來我們來到Android開發文檔中找到SQLiteDatabase中的insert方法。

可以發現 SQLiteDatabase的insert方法有三個參數,其中table表示表名,nullColumnHack表示當表的某行爲空時用來代替的字符串,還有一個就是ContentValues,我們接着介紹一下它。

  • ContentValue(Android提供的一種數據類型) - 常用於Android中數據庫的添加

我們在剛剛進行INSERT操作的方法中進行修改,用ContentValue的方式來實現

  1. 創建一個ContentValue對象
  2. 使用put方法,將對應輸入的內容與每一列的名稱對應起來
  3. 最後使用SQLiteDatabase中的 insertOrThrow 方法進行插入。

Tips:這裏值得注意的是,insertOrThrow 方法如果插入時出現異常,該方法會拋出異常,因此我們需要將它寫在 try-catch 代碼塊中,並在 catch 中將錯誤信息寫入Android的Log中。

        TextView tv = (TextView)  findViewById(R.id.text1);

        Button bt1 =(Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(){
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("INSERT");
                SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
                ContentValues cv = new ContentValues();
                cv.put("name", "name2");
                cv.put("phone", 123123123123L);
                try {
                    sqlDB.insertOrThrow("tb1", null, cv);
                } catch (Exception e) {
                    Log.e("DBerror", e.getMessage());
                }
            }
        });

我們同樣運行程序,觸發該點擊事件後 重新回到命令行窗口,查找我們數據庫中已有表tb1中的數據,發現該記錄已經成功寫入。

  • Retrieve records from a table; (從表中獲取記錄)

         我們可以通過SQLiteDatabase中的query()方法來實現從表中獲取記錄

同樣我們先看看在Android開發文檔中是如何定義query方法的。

從文檔中我們可以看到query方法具有多種調用方式,在這裏我們選擇第一種進行進一步的探討。

  1. distinct :如果希望每行唯一,則爲true;否則爲false。
  2. table :要查詢的表名。
  3. columns :要查詢的列
  4. selection :聲明要返回哪些行的篩選器,格式爲sql where子句(不包括where本身)。傳遞null將返回給定表的所有行。
  5. limit :限制查詢返回的行數,傳遞null表示沒有限制。

Tips :值得注意的是,使用該方法返回的將會是一個Cursor(指針),接下來我們用query方法來實現數據庫的查詢。

       TextView tv = (TextView) findViewById(R.id.text1);

        Button bt1 = (Button) findViewById(R.id.button1);
        bt1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                TextView tv = (TextView) findViewById(R.id.text1);
                tv.setText("Dial");

                try {
                    String[] fields = {"name"}; //查詢的列名
                    Cursor c = sqlDB.query("tb1", fields, null, null, null, null, null, null);

                    /*將指針指向開頭
                     *判斷是否爲空
                     *不爲空則將查詢的結果加入到TextView的文本中進行顯示
                     *將指針移向下一位
                     */
                    if (c.moveToFirst()) {
                        while (c.isAfterLast() == false) {
                            tv.append(c.getString(0) + " ");
                            c.moveToNext();
                        }
                    }

                    /*如果指針不爲空,則關閉該指針*/
                    if (c != null)
                        c.close();
                } catch (Exception e) {
                    Log.e("DBerror", e.getMessage());
                } finally {

                    /*關閉數據庫*/
                    if (sqlDB != null)
                        sqlDB.close();
                }
            }
        });

結果展示:

 

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