Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android SQLite 的介紹和使用(二)

Android SQLite 的介紹和使用(二)

編輯:關於Android編程

上一節簡單介紹了一下SQLite,這一節我們開始SQLite在Android中的應用。

Android提供了一個數據庫的幫助類 SQLiteOpenHelper,用於管理數據庫的創建和版本管理。我們可以繼承這個類,實現它的 onCreateonUpgrade方法。我們可以在這裡設置數據庫的版本,數據庫名稱,創建數據庫表等。下面看代碼:

public class DBHelper extends SQLiteOpenHelper {
    //數據庫的版本號必須要大於1
    public final static int DB_VERSION = 1;
    //數據庫的名稱
    public final static String DB_NAME = "user.db";
    //數據庫表名
    public final static String TABLE_NAME = "userInfo";

    public static DBHelper helper = null;

    public static DBHelper getHelper() {
        if (helper == null) {
            helper = new DBHelper(App.getContext());
        }
        return helper;
    }


    private DBHelper(Context context) {
        //調用父類方法創建數據庫,CusorFactory 一般為空,使用默認的
        //CursorFactory對象,用來構造查詢完畢時返回的Cursor的子類對象,為null時使用默認的CursorFactory構造。
        super(context, DB_NAME, null, DB_VERSION);
    }


    /**
     * 數據庫第一次創建時調用,我們在這裡執行一些數據庫表的創建,初始化等操作
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        createTableUser(db);
    }

    /**
     * 當數據庫更新時調用,我們可以在升級時執行數據庫修改;比  如修改表,刪除表,添加表等。
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            dropTableUser(db);
            createTableUser(db);
        }
    }

    private void createTableUser(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);";
        db.execSQL(sql);
    }

    private void dropTableUser(SQLiteDatabase db) {
        String sql = "drop table if exists " + TABLE_NAME;
        db.execSQL(sql);
    }
}

當我們創建好我們數據庫幫助類後,我們就可以通過它來進行數據庫的操作了。當然我們也可以把一些數據庫 增、刪、改、查 的方法放到這個數據庫幫助類裡。

增 (insert):

往數據庫表裡插入數據一般有兩種方式,一個是使用 SQL語句,一個是使用Android 提供的insert方法。

使用SQL 語句

使用SQL語句,我們首先需要組拼一下我們的SQL語句,我們使用StringBuilder:

StringBuilder sql = new StringBuilder();
sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(")
    .append(" '張三'").append(",")
    .append("20").append(",")
    .append("'火星" + i + "號'")
    .append(" );")

然後 使用數據庫的 execSQL 執行這個SQL語句。

mDatabase.execSQL(sql.toString());
Android 提供的insert方法

使用Android 提供的insert方法,需要用到另一個對象ContentValues,它類似於Map,以鍵值對的形式保存數據,鍵代表的是表的列名,值代表該列插入的值。具體使用如下。

    ContentValues values = new ContentValues();
    values.put("name", "張三");
    values.put("age", 20);
    values.put("address", "火星1號");

然後調用insert方法:

 mDatabase.insert(DBHelper.TABLE_NAME, null, values);

刪(delete):

使用SQL:

組拼SQL:

    StringBuilder builder = new StringBuilder();
    builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");

大家應該注意到 SQL 語句末尾的where語句的條件是’?’,這裡的’?’起到的是占位符的作用,我們在下面需要使用 “String[]”來填入具體的值,比如這裡我們可以:

String[] bindArgs = {"1"};

然後我們調用數據庫的 execSQL方法來執行數據的刪除:

mDatabase.execSQL(builder.toString(), bindArgs);

它執行的SQL 語句相當於:

delete from userInfo where _id = 1 ;

當然我們也可以自己把條件值直接組拼成String語句。

使用Android提供的delete方法:

Android 提供的delete方法需要提供表名,where子句,where子句的條件,並且這個方法返回的是delete影響到的行數。

    //where子句
    String whereClause = "_id = ?";
    //where字句裡的裡占位符的值
    String[] whereArgs = {"1"};
    int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs);

改(update)

使用SQL 語句

首先我們組拼SQL語句:

    StringBuilder builder = new StringBuilder();
    builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;");

然後定義數組來表示 set 子句中 ‘?’占位符的值:

Object[] bindArgs = {"趙六", 13, "水星1號", 5};

然後我們調用數據庫的 execSQL方法來執行數據的更新:

mDatabase.execSQL(builder.toString(), bindArgs);
使用Android 自帶的update方法

使用Android提供的update 方法,需要用到ContentValues對象,來確定需要更新的列和值。

    ContentValues values = new ContentValues();
    values.put("name", "錢八");
    values.put("age", 15);
    values.put("address", "水星2號");

然後我們需要准備好,where子句和where子句中占位的值:

    String whereClause = "_id=?";
    String[] whereArgs = {"4"};

然後調用數據庫的update方法執行更新數據的操作:

  mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs);

查(select)

使用SQL語句:

Android 查詢數據庫的結果返回到一個Cursor 對象裡。它會定位到第一行之前。所有的數據都是通過下標取得。

首先我需要組拼SQL語句:

 StringBuilder builder = new StringBuilder();
    builder.append(" select * from ").append(DBHelper.TABLE_NAME);

然後調用數據庫的 rawQuery 方法來執行查詢,它會返回一個Cursor:

Cursor cursor = mDatabase.rawQuery(builder.toString(), null);

由於Cursor獲取數據都是通過下標來獲取的,Cursor專門提供了一個通過列表獲取下標的方法:

cursor.getColumnIndex(列名);

Cursor 定位是定在第一行之前的我們需要調用 moveToNext()定位到第一行,當然還有很多move開頭方法,大家可以多研究一下。

這樣我們就可以使用循環來獲取我們需要的內容了,我們把數據表裡的內容都保存到List裡面。

    List users = new ArrayList<>();
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        User user = new User(name, age, address);
        users.add(user);
    }

最後 我們的Cursor對象需要 close 方法,把資源釋放掉。

cursor.close();
使用Android提供的query方法:

我們需要提供需要查詢的列名:

String[] columns = {"name", "age", "address"};

where條件:

String selection = "_id=?";

where 條件中 ‘?’的替代值:

String[] selectionArgs = {"1"};

我們調用query方法來執行查詢:

Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null);

其中後面的三個數分別為 groupBy子句,having子句,orderBy子句,如果有這些需求可以自己定義。

然後我們再把數據從Cursor裡取出來,放到List裡。

    List users = new ArrayList<>();
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("name"));
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        User user = new User(name, age, address);
        users.add(user);
    }

最後關閉 Cursor,釋放資源:

 cursor.close();

全部代碼如下:
 

public class DBHelper extends SQLiteOpenHelper {
    //數據庫的版本號必須要大於1
    public final static int DB_VERSION = 1;
    //數據庫的名稱
    public final static String DB_NAME = "user.db";
    //數據庫表名
    public final static String TABLE_NAME = "userInfo";

    public static DBHelper helper = null;
    public SQLiteDatabase mDatabase;

    public static DBHelper getHelper() {
        if (helper == null) {
            helper = new DBHelper(App.getContext());
        }
        return helper;
    }


    /**
     * 通過SQLiteOpenerHelper創建數據庫表,
     * <p/>
     * getWritableDatabase 與 getReadableDatabase 的區別
     * <p/>
     * getWritableDatabase取得的實例不是僅僅具有寫的功能,而是同時具有讀和寫的功能
     * 同樣的,getReadableDatabase 取得的實例也是具對數據庫進行讀和寫的功能
     * 兩者的區別在於
     * getWritableDatabase取得的實例是以讀寫的方式打開數據庫,如果打開的數據庫磁盤滿了,此時只能讀不能寫,此時調用了getWritableDatabase的實例,那麼將會發生錯誤(異常)
     * getReadableDatabase取得的實例是先調用getWritableDatabase以讀寫的方式打開數據庫,如果數據庫的磁盤滿了,此時返回打開失敗,繼而用getReadableDatabase的實例以只讀的方式去打開數據庫
     */
    private DBHelper(Context context) {
        //調用父類方法創建數據庫,CusorFactory 一般為空,使用默認的
        //CursorFactory對象,用來構造查詢完畢時返回的Cursor的子類對象,為null時使用默認的CursorFactory構造。
        super(context, DB_NAME, null, DB_VERSION);
        //獲取數據庫對象。
        mDatabase = getReadableDatabase();
//        mDatabase = getWritableDatabase();
    }


    /**
     * 數據庫第一次創建時調用,我們在這裡執行一些數據庫表的創建,初始化等操作
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        createTableUser(db);
    }

    /**
     * 當數據庫更新時調用,我們可以在升級時執行數據庫修改;比如修改表,刪除表,添加表等。
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion) {
            dropTableUser(db);
            createTableUser(db);
        }
    }

    public void createTableUser(SQLiteDatabase db) {
        String sql = "CREATE TABLE " + TABLE_NAME + "(_id integer primary key autoincrement ,NAME TEXT,AGE INT,ADDRESS TEXT);";
        db.execSQL(sql);
    }

    public void dropTableUser(SQLiteDatabase db) {
        String sql = "drop table if exists " + TABLE_NAME;
        db.execSQL(sql);
    }


    /**
     * 查看是否存在某個數據庫表
     * <p/>
     * sqlite_master: SQLite數據庫都有一個叫 SQLITE_MASTER 的表, 它定義數據庫的模式,這個表是只讀的
     *
     * @param tableName
     * @return
     */
    public boolean isTableExist(String tableName) {
        String sql = "SELECT COUNT(*) AS c FROM sqlite_master WHERE type='table' AND name='" + tableName + "'";
        Cursor cursor = mDatabase.rawQuery(sql, null);
        if (cursor.moveToNext()) {
            int count = cursor.getInt(0);
            if (count > 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 使用SQL 實現插入
     */
    public void insertWithSQL() {
        SQLiteDatabase db = mDatabase;
        db.beginTransaction();
        try {
            for (int i = 0; i < 10; i++) {
                StringBuilder sql = new StringBuilder();
                sql.append("insert into " + DBHelper.TABLE_NAME + "(name,age,address) values(")
                        .append(" '張三'").append(",")
                        .append("20").append(",")
                        .append("'火星" + i + "號'")
                        .append(" );");
                db.execSQL(sql.toString());
            }

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

    /**
     * 使用 ContentValues 實現插入數據
     */
    public void insert() {
        ContentValues values = new ContentValues();
        values.put("name", "張三");
        values.put("age", 20);
        values.put("address", "火星1號");
        mDatabase.insert(DBHelper.TABLE_NAME, null, values);
    }


    /**
     * 使用SQL 語句刪除數據
     */
    public void deleteBySQL() {
        StringBuilder builder = new StringBuilder();
        builder.append(" delete from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");
        String[] bindArgs = {"1"};
        mDatabase.execSQL(builder.toString(), bindArgs);
    }

    /**
     * 使用Android 提供的delete 方法
     *
     * @return
     */
    public int delete() {
        //where子句
        String whereClause = "_id = ?";
        //where字句裡的裡占位符的值
        String[] whereArgs = {"1"};
        int affectedRows = mDatabase.delete(DBHelper.TABLE_NAME, whereClause, whereArgs);
        return affectedRows;
    }


    /**
     * 使用SQL修改數據
     */
    public void updateBySQL() {
        StringBuilder builder = new StringBuilder();
        builder.append("update ").append(DBHelper.TABLE_NAME).append(" set name=?,age=?,address=? where _id=?;");
        Object[] bindArgs = {"趙六", 13, "水星1號", 5};
        mDatabase.execSQL(builder.toString(), bindArgs);
    }

    /**
     * 使用Android 提供的update方法修改數據
     */
    public void update() {
        ContentValues values = new ContentValues();
        values.put("name", "錢八");
        values.put("age", 15);
        values.put("address", "水星2號");
        String whereClause = "_id=?";
        String[] whereArgs = {"4"};
        mDatabase.update(DBHelper.TABLE_NAME, values, whereClause, whereArgs);
    }


    /**
     * 使用 SQL 實現查詢所有數據
     */
    public void queryDataBySql() {
        StringBuilder builder = new StringBuilder();
        builder.append(" select * from ").append(DBHelper.TABLE_NAME);
        Cursor cursor = mDatabase.rawQuery(builder.toString(), null);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

    /**
     * 使用 SQL 實現查詢某條數據
     */
    public void queryDataBySql1() {
        StringBuilder builder = new StringBuilder();
        builder.append(" select name,age,address from ").append(DBHelper.TABLE_NAME).append(" where _id = ?");
        String[] selectArgs = {"1"};
        Cursor cursor = mDatabase.rawQuery(builder.toString(), selectArgs);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }


    /**
     * 使用Android提供的 query 方法 ,實現查詢所有數據
     */
    public void queryAll() {
        Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, null, null, null, null, null, null);
        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("NAME"));
            int age = cursor.getInt(cursor.getColumnIndex("AGE"));
            String address = cursor.getString(cursor.getColumnIndex("ADDRESS"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

    /**
     * 使用Android提供的 query 方法 ,實現查詢某條數據
     */
    public void query() {

        //想要查詢的那些列
        String[] columns = {"name", "age", "address"};
        //where條件
        String selection = "_id=?";
        //where 條件中 '?'的替代值
        String[] selectionArgs = {"1"};
        Cursor cursor = mDatabase.query(DBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null, null);

        List<User> users = new ArrayList<>();
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex("name"));
            int age = cursor.getInt(cursor.getColumnIndex("age"));
            String address = cursor.getString(cursor.getColumnIndex("address"));
            User user = new User(name, age, address);
            users.add(user);
        }

        LogUtils.e(users + "");
        cursor.close();
    }

}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved