Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android數據存儲]- SQLite Database

[Android數據存儲]- SQLite Database

編輯:關於Android編程

個人學習整理,如有不足之處,請不吝指教。轉載請注明:@CSU-Max

 

 

SQLite Database 簡介:

SQLite,是一款輕量級的關系型數據庫。由於它占用的資源非常少,所以在很多嵌入式設備都是用SQLite來存儲數據。並且它目前支持Windows/Linux/Unix等等主流的操作系統,兼容性還不錯。我們也可以用多種開發語言如C#、Java、PHP等來通過ODBC接口操作SQLite,十分方便。 由於 SQLite 數據庫占用資源小,使用簡單,故在 Android 上存儲數據,使用 SQLite 是一種很好的選擇。

SQLite 支持的常用的 SQL 語句:

創建表: create table if not exists user(_id integer primary key autoincrement, name text) 刪除表: drop table if exists user 查詢數據: select * from user; select * from user where _id = 2; select name from user group by city having count(*) > 1 分頁查詢: 跳過前面的15跳記錄,查詢接下來的5跳記錄: select * from user limit 15,5; 或 select * from user limit 5 offset 15; 插入數據: insert into user(name) values ('CSUMax'); 刪除數據: delete from user where _id = 2; 更新數據: update user set name = 'Cindy' where _id = 3;

基本數據庫操作:

1、操作 SQLite 的一般步驟:

(1) 獲取 SQLiteDatabase 對象,相當於獲取數據庫連接; 在 Android 中進行數據庫操作時,首先使用我們自定義的 SQLiteOpenHelper 的子類(如下例中的 DBOpenHelper)的getReadableDatabase() 或getWritableDatabase() 獲取只讀或可寫的數據庫對象 SQLiteDatabase(如數據庫不存在則創建數據庫)。 (2) 調用 SQLiteDatabase 的方法來執行SQL語句; SQLiteDatabase 中封裝了一系列增刪改查的方法,當然,也可以使用 execSQL 方法執行 SQL 語句。 (3) 操作 SQL 語句執行的結果; 對於查詢結果,我們可以使用 HashMap ,也可以使用 Andorid 為我們提供的 ContentValues 來保存。當使用ListView 等空間來顯示多條記錄的時候,可以使用我們常用的 List(使用SampleAdapter適配器),也可以直接返回 Cursor(使用 SampleAdapter 適配器)。 (4) 關閉 SQLiteDatabase 。 完成數據庫相關操作之後,要及時釋放資源。

2、使用 SQLite 進行簡單的增刪改查操作:

(1) 查詢數據

db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy) 各參數含義: table : 要查詢表的表名; columns : 查詢的列數組 selection : 查詢條件,中間可以含 “?”; selectionArgs : 表示查詢條件中參數的數組; groupBy : 分組,對應SQL中的 group by ; having : 對應SQL中的 having 語句; orderBy : 對應SQL中的 order by 語句 ;

查詢所有數據:

主要代碼:

 

	/**
	 * 查詢所有的記錄
	 * @return
	 */
	public List queryAll() {
		List list = new ArrayList();
		SQLiteDatabase db = null;
		Cursor cursor = null;

		try {
			//獲取只讀數據庫實例
			db = dbOpenHelper.getReadableDatabase();
			cursor = db.query("user", null, null, null, null, null, "_id desc");
			//遍歷 Cursor
			for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
					.moveToNext()) {
				User user = new User();
				user.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				user.setName(cursor.getString(cursor.getColumnIndex("name")));
				list.add(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cursor != null) {
				cursor.close();
			}
			if (db != null) {
				db.close();
			}
		}
		return list;
	}

 

 

根據 id 查詢一條數據:

主要代碼:
	/**
	 * 根據 id 查詢記錄
	 * @param id
	 * @return
	 */
	public User queryUserById(int id) {
		User user = new User();
		SQLiteDatabase db = null;
		Cursor cursor = null;

		try {
			//獲取只讀數據庫
			db = dbOpenHelper.getReadableDatabase();
			cursor = db.query("user", null, "_id = ?",
					new String[] { String.valueOf(id) }, null, null, null);
			if (cursor.moveToFirst()) {
				user.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				user.setName(cursor.getString(cursor.getColumnIndex("name")));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cursor != null) {
				cursor.close();
			}
			if (db != null) {
				db.close();
			}
		}
		return user;
	}

 

 

模糊查詢:

主要代碼:

 

	/**
	 * 根據某一字段的部分值進行模糊查詢
	 * 
	 * @param word
	 * @return
	 */
	public List queryByWord(String word) {
		List list = new ArrayList();
		SQLiteDatabase db = null;
		Cursor cursor = null;

		try {
			// 獲取只讀數據庫
			db = dbOpenHelper.getReadableDatabase();
			cursor = db.query("user", null, "name like ?", new String[] { word
					+ "%" }, null, null, null);
			// 遍歷 Cursor
			for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
					.moveToNext()) {
				User user = new User();
				user.setId(cursor.getInt(cursor.getColumnIndex("_id")));
				user.setName(cursor.getString(cursor.getColumnIndex("name")));
				list.add(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cursor != null) {
				cursor.close();
			}
			if (db != null) {
				db.close();
			}
		}
		return list;
	}

 

 

(2) 插入數據

db.insert(table, nullColumnHack, values) 各參數含義: table : 要插入數據的表名; nullColumnHack : 表示當 ContentValues 為空時,那一列賦 null 值; values : 表示要插入的列和值。 返回插入成功的行數。 主要代碼:
 /**
     * 向 user 表中 插入一個 user,將 user 的 name 屬性插入到 user 表中的 name 列
     * @param user
     * @return
     */
    public long insert(User user) {
        SQLiteDatabase db = null;
        long id = -1;
        try {
            db = dbOpenHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("name", user.getName());
            id = db.insert("user", null, values);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.close();
            }
        }
        return id;
    }

(3) 刪除數據

db.delete(table, whereClause, whereArgs) 各參數含義: table : 要刪除數據的表名; whereClause : 刪除條件,即普通 SQL 語句 where 後面的部分,可以帶 “?”; whereArgs: 參數值數組。 主要代碼:
 /**
     * 刪除指定 id 的數據
     * @param id
     */
    public void delete(int id) {
        SQLiteDatabase db = null;
        try {
            db = dbOpenHelper.getWritableDatabase();
            db.delete("user", "_id = ?", new String[] { String.valueOf(id) });
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.close();
            }
        }
    }

(4) 更新數據

db.update(table, values, whereClause, whereArgs) 各參數含義: table : 要更新數據的表名; values : 修改的列名和修改後的值; whereClause : 修改條件,即普通 SQL 語句 where 後面的部分,可以帶 “?”; whereArgs: 參數值數組。 返回更新成功的行數。 主要代碼:
   /**
     * 更新數據操作
     * @param user
     * @return
     */
    public long update(User user) {
        SQLiteDatabase db = null;
        long id = -1;
        try {
            db = dbOpenHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put("name", user.getName());
            id = db.update("user", values, "_id = ?",
                    new String[] { String.valueOf(user.getId()) });
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.close();
            }
        }
        return id;
    }

 

 

2、使用 SQLite 進行數據分頁:

(1) 創建一個分頁的類 Page類

public class Page {
    // 每頁顯示的記錄數
    private int pageSize = 3;
    // 當前打的頁數
    private int pageNum = 1;
    // 總的記錄數
    private int totalCount = 0;
    // 總的頁數
    private int totalNum = 0;
    /**
     * 是否有下一頁
     * @return
     */
    public boolean isHasNext() {
        if (pageNum < totalNum) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * s是否有上一頁
     * @return
     */
    public boolean isHasPre() {
        if (pageNum > 1) {
            return true;
        } else {
            return false;
        }
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNum() {
        return pageNum;
    }
    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }
    public int getTotalCount() {
        return totalCount;
    }
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
    public int getTotalNum() {
        return totalNum;
    }
    public void setTotalNum(int totalNum) {
        this.totalNum = totalNum;
    }
}

(2) 獲取某一頁的數據

 

 

/**
     * 獲取某一頁的數據
     * 
     * @param pageSize
     *            每頁顯示記錄數
     * @param pageNum
     *            當前的頁碼
     * @return
     */
    public List getPageUser(int pageSize, int pageNum) {
        List list = new ArrayList();
        SQLiteDatabase db = null;
        Cursor cursor = null;
        try {
            // 獲取只讀數據庫實例
            db = dbOpenHelper.getReadableDatabase();
            // 使用 limit ? offset ? 來進行分頁
            cursor = db.query("user", null, null, null, null, null,
                    "_id asc limit " + String.valueOf(pageSize) + " offset "
                            + String.valueOf((pageNum - 1) * pageSize));
            // 遍歷 Cursor
            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
                    .moveToNext()) {
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex("_id")));
                user.setName(cursor.getString(cursor.getColumnIndex("name")));
                list.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return list;
    }

 

通過以上的代碼,我們就完成了初步的分頁操作,下面我們對此進行完善一下,獲得總頁數,增加上一頁和下一頁功能。

(3) 獲取總頁數

先獲取總的記錄數,在根據 pageSize 來計算得出總頁數:

 

 

 /**
     * 獲取表中總的記錄數
     * 
     * @return
     */
    public int getTotalCount() {
        SQLiteDatabase db = null;
        Cursor cursor = null;
        int totalCount = 0;
        try {
            // 獲取只讀數據庫實例
            db = dbOpenHelper.getReadableDatabase();
            cursor = db.query("user", null, null, null, null, null, null);
            // 獲取記錄數
            totalCount = cursor.getCount();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
            if (db != null) {
                db.close();
            }
        }
        return totalCount;
    }
    /**
     * 得到中的頁數
     * 
     * @param pageSize
     * @return
     */
    public int getTotalNum(int pageSize) {
        int totalNum = 0;
        totalNum = getTotalCount() / pageSize + 1;
        return totalNum;
    }

 

(4) 上下翻頁功能


 

 

 /**
     * 顯示下一頁的數據
     * 
     * @param pageSize
     *            每頁顯示記錄數
     * @param pageNum
     *            當前的頁碼
     * @return
     */
    public List getNextPage(int pageSize, int pageNum) {
        List list = new ArrayList();
        //設置Page對象的屬性
        Page page = new Page();
        page.setPageSize(pageSize);
        page.setPageNum(pageNum);
        page.setTotalCount(getTotalCount());
        page.setTotalNum(getTotalNum(pageSize));
        // 判斷是否有下一頁,有下一頁則顯示下一頁的數據
        if (page.isHasNext()) {
            list = getPageUser(pageSize, pageNum + 1);
        }
        return list;
    }
    /**
     * 顯示上一頁的數據
     * 
     * @param pageSize
     *            每頁顯示記錄數
     * @param pageNum
     *            當前的頁碼
     * @return
     */
    public List getPrePage(int pageSize, int pageNum) {
        List list = new ArrayList();
        Page page = new Page();
        page.setPageSize(pageSize);
        page.setPageNum(pageNum);
        page.setTotalCount(getTotalCount());
        // 判斷是否有上一頁,有上一頁則顯示上一頁的數據
        if (page.isHasNext()) {
            list = getPageUser(pageSize, pageNum - 1);
        }
        return list;
    }

 

SQLite中的事務管理:

SQLite 中同樣支持事務。 當我們要向數據庫中插入很多的數據時,若使用 for 遍歷 insert 插入的話,會很消耗資源,影響效率,也不能保證插入的穩定性。因為 SQLite插入數據的時候,默認一條插入語句就是一個事務,這樣在進行多條數據插入的時候就會進行多次的磁盤操作,而且不能保證所有的數據都插入正確,這時候使用事務就很方便了。

1、SQLite中事務操作的常用方法:

beginTransaction() : 開啟事務; endTransaction() : 關閉事務; setTransactionSuccessful() : 設置事務標志位的為成功,當標志位為成功時,endTransaction()就會提交事務, 否則 endTransaction() 會回滾事務。

2、SQLite中事務操作的實例代碼:


 

 

 public long insert() {
        SQLiteDatabase db = null;
        long id = 0;
        try {
            db = dbOpenHelper.getWritableDatabase();
            // 開啟事務
            db.beginTransaction();
            ContentValues values = new ContentValues();
            for (int i = 0; i < 5; i++) {
                values.put("name", "姓名" + 1);
                id = db.insert("user", null, values) + id;
            }
            // 設置事務標志位為成功
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (db != null) {
                // 結束事務,根據標志位來決定是提交還是回滾
                db.endTransaction();
                db.close();
            }
        }
        return id;
    }

關於 SQLite的簡單使用方法就介紹到這裡,下一節將總結 Android 中的文件存儲數據。

個人學習整理,如有不足之處,請不吝指教。轉載請注明:@CSU-Max

 

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