Android|SQLite的入門使用

SQLite:輕量級數據庫,適合應用移動端數據存儲。

入門使用

  • 需求:在 SQLite 數據庫中創建一個 user 表,其中包含 id ,username,password字段。然後我們需要插入一條數據來測試。

  • 簡要思路:

    1. 寫一個子類繼承SQLiteOpenHelper(這個類能夠幫助我們創建數據庫,升級數據庫,創建表,修改表,獲取數據庫交互對象等)。
    2. 使用SQLiteOpenHelper子類對象來獲取數據庫交互對象。
    3. 執行增刪改查。
    4. 釋放資源。
  • 現在開始編寫代碼。

第一步: 寫一個子類繼承SQLiteOpenHelper。

package com.recoder.sqlite_use;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

/**
 * 注意這個類不僅僅要實現onCreate方法和onUpgrade方法。
 * 因爲父類只有有參構造,所以我們也需要編寫一個有參構造,
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
    /**
     * 構造方法
     * @param context 上下文對象,傳入Activity對象即可
     * @param name 數據庫名字
     * @param factory 遊標對象
     * @param version 數據庫版本
     */
    public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /**
     * 創建SQLite數據庫後的回調方法
     * 在這個方法中我們可以創建表,修改表等
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table user(id int primary key,username varchar(12),password varchar(16))";
        db.execSQL(sql);
    }

    /**
     * 數據庫升級
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, i
                          nt oldVersion, int newVersion) {

    }
}

第二步: 在 Activity 中完成簡要思路中的2,3,4步。

package com.recoder.sqlite_use;

import androidx.appcompat.app.AppCompatActivity;

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

        //獲取SQLiteOpenHelper對象
        SQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this, "myDB", null, 1);
        //獲取數據庫交互對象
        SQLiteDatabase db = helper.getWritableDatabase();//這一步執行完畢後,就會去調用MySQLiteOpenHelper的onCreate方法
        //定義sql
        String sql = "insert into user values(?,?,?)";
        //執行插入
        db.execSQL(sql,new Object[]{1,"zhangsan","123"});
        //釋放資源
        db.close();
    }
}

第三步: 運行我們的app。這時候我們就會問了,創建了 SQLite 數據庫,那它在哪那,同時表裏的數據怎麼看那?

  1. 這時候我們需要保持我們的虛擬設備開啓,然後點擊View -> Tool windows -> Device File Explorer。

在這裏插入圖片描述

  1. 然後找到 data/data/com.recoder.sqlite_user(個人的項目名)/databases/myDB(之前在代碼中定義的數據庫名)

在這裏插入圖片描述

  1. 然後右擊 myDB,save as 。保存到我們的磁盤中,注意加上.db後綴名。我就把它放桌面上了。
    在這裏插入圖片描述

  2. 這個文件需要使用圖形化管理軟件打開。圖形化管理軟件我們使用 SQLite Expert。下載地址:SQLite Expert

  3. 使用 SQLite Expert 打開 myDB.db 文件。

在這裏插入圖片描述

  1. 選中user表,點擊 Design 可以看我們的表結構,點擊 Data 可以看錶中的數據。

在這裏插入圖片描述

  1. 可以看到我們的數據插入成功了,至此入門成功。

細節注意:

  1. 在執行數據庫修改後,我們要在device file explorer中同步我們的修改。
    在這裏插入圖片描述

  2. save as 的時候覆蓋上一次保存的myDB.db文件時,可能會保存失敗。原因:SQLite Expert打開了myDb.db,導致文件被佔用,我們無法save as覆蓋該文件。該報錯會在Android Studio的右下角 event log 找到。解決辦法就是:關閉sqlite expert後,再save as 我們的數據庫文件。

關於CRUD操作

  • 增刪改 全部用SQLiteDatabase對象execSQL方法。
  • 查詢 使用SQLiteDatabase對象rawQuery方法。下面是一個示例
public class MainActivity extends AppCompatActivity {

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

    public List<User> selectAll() {
        //獲取SQLiteOpenHelper對象
        SQLiteOpenHelper helper = new MySQLiteOpenHelper(MainActivity.this, "myDB", null, 1);
        //獲取數據庫交互對象
        SQLiteDatabase db = helper.getReadableDatabase();
        //定義sql
        String sql = "select * from user where name like ?";
        //執行 sql,獲取遊標對象
        Cursor cursor = db.rawQuery(sql, new String[]{"%zhang%"});
        //遍歷獲取結果
        List<User> users = new ArrayList<>();
        //moveToNext():如果當前遊標對象能夠下移一行,則返回true。同時遊標下移一行。
        while (cursor.moveToNext()) {
            User u = new User();
            //Cursor對象的getXxx方法用於獲取表中指定索引列的值,索引從0開始
            //比如username在第二列,是varchar類型,使用getString(1)就可以把它的值取到
            u.setId(cursor.getInt(0));
            u.setPassword(cursor.getString(1));
            u.setUsername(cursor.getString(2));
            users.add(u);
        }
        //釋放資源
        db.close();
        return users;
    }
}

  • 關於遊標
    在這裏插入圖片描述
    如果有下一行數據,那麼moveToNext()返回true,同時下移一行。遊標對象指示着結果中的每一行數據,我們可以使用Cursor對象的成員方法來獲取指定列的數據。有點類似於jdbc中對ResultSet的處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章