Use SQLite to record user history

如果我們想記錄使用者在APP上互動的歷史,我們可能會需要紀錄她在某個時候,做了什麼樣的一個動作。在Android中有很多可以進行紀錄的方法,其中SQLite API最被廣為人知的應用就是用來實作TodoList、通訊錄或是其他牽涉到Client端資料庫的應用,而這邊我們也使用SQLite來進行紀錄使用者紀錄。
SQLite的教學可以參考Vogella,寫得相當完整且英文描述也非常的平易近人
教學文中主要將使用SQLite存取資料的功能分成三個物件
包括了:

  1. 自訂的SQLiteOpenHelper(用來執行資料庫的一些任務)
  2. Getter & Setter(存取資料)
  3. 還有資料存取物件(Data Access Object,DAO,為連結以上兩者的橋樑)

以下分別介紹這三者的起手式。

Custom SQLiteOpenHelper

public class DBHelper extends SQLiteOpenHelper{

 public DBHelper(Context context) {
                // DATABASE.NAME(String)與DATABASE.VERSION(int)都是我自訂interface的數值
                // 分別代表資料庫的名稱與版本
  super(context, DATABASE.NAME, null, DATABASE.VERSION);
 }

        // 資料庫一開始建置時會執行的動作將在onCreate生命週期中觸發
 @Override
 public void onCreate(SQLiteDatabase db) {

                // 這邊和SQL很像,就用你熟悉的方式輸入指令
  String sql = "CREATE TABLE IF NOT EXISTS " + DATABASE.TABLE +
    " (" +
    " " + DATABASE.UID + " TEXT," +
    " " + DATABASE.DID + " TEXT," +
    " " + DATABASE.TIME + " DATETIME," +
    " " + DATABASE.RID + " TEXT" +
    ");";
  
                // 執行
  db.execSQL(sql);
 }

        // 若發現更新後的資料庫(版本不一樣時),刪除原本的資料庫,並建置一個新的
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

  String sql = "DROP TABLE IF EXISTS " + DATABASE.TABLE;
  
  db.execSQL(sql);
  onCreate(db);
 }
}

Getters & Setters

public class UserHistory {

 private String uid;
 private String did;
 private String time;
 private String rid;

 public String getUid() {
  return uid;
 }

 public void setUid(String uid) {
  this.uid = uid;
 }

 public String getDid() {
  return did;
 }

 public void setDid(String did) {
  this.did = did;
 }

 public String getTime() {
  return time;
 }

        ... // 以此類推

Data Access Object

// 這邊是最重要的部分,所有有關資料存取的動作我們都在這裡調用
// 如此一來就不需要動到以上兩個物件,妥善隱藏資料的本質
public class HistoryDAO {

 private SQLiteDatabase database;
 private DBHelper dbHelper;

 public HistoryDAO(Context context) {
  dbHelper = new DBHelper(context);
 }

 // 開啟資料庫
 public void open() throws SQLException {
  database = dbHelper.getWritableDatabase();
 }

 // 關閉資料庫
 public void close() {
  dbHelper.close();
 }

 // 輸入資料到資料庫中
 public void insert(String uid, String did, String rid) {

  // 使用key/value的方式儲存資料,再丟給資料庫insert
  ContentValues values = new ContentValues();
  values.put(DATABASE.UID, uid);
  values.put(DATABASE.DID, did);
  values.put(DATABASE.TIME, getCurrentTime());
  values.put(DATABASE.RID, rid);

  database.insert(DATABASE.TABLE, null, values);
 }

 // 因為我們在台灣,需要調整時區,以獲得使用者產生互動的正確時間
 private String getCurrentTime() {
  // 註1
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
  
  String currentTime = dateFormat.format(new java.util.Date());
  return currentTime;
 }

 // 這邊因為我在測試是不是真的有輸入成功,於是在進行query後取得數量
 public int size() {
  Cursor cursor = database.query(DATABASE.TABLE, new String[] { 
    DATABASE.UID,
    DATABASE.DID,
    DATABASE.TIME,
    DATABASE.RID }, null, null, null, null, null);
  
  return cursor.getCount();
 }
}

註1:時間的格式有標準的規定,例如年份並不支援大寫Y。
SQLite也很有個性,有它自己能接受的時間格式。(繁體中文版本)

藉由以上三個物件的實作,已經可以應付最基礎的資料存取功能。
儲存完使用者的歷史紀錄之後,接著就要開始著手偏好分析。

Reference,


JAVA的日期時間取得 @ ROACH部落落 :: 痞客邦 PIXNET ::

沒有留言:

張貼留言