Android SQLite 的介紹和使用(二)

來源:互聯網
上載者:User

標籤:

上一節簡單介紹了一下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<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);    }

最後 我們的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<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);    }

最後關閉 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();    }}

Android SQLite 的介紹和使用(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.