package com.datdo.mobilib.cache; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils; import com.datdo.mobilib.db.DBBase; import com.datdo.mobilib.util.MblUtils; public class MblDatabaseCache extends DBBase { private static final String TABLE = "cache"; private static final String COL_KEY = "key"; private static final String COL_DATE = "date"; private String mKey; private long mDate; public static void createTable(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE); db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + "(" + COL_KEY + " TEXT NOT NULL," + COL_DATE + " LONG)"); db.execSQL("CREATE INDEX " + TABLE + "_index ON " + TABLE + "(" + COL_KEY + ")"); } public static void dropTable(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE); } public MblDatabaseCache() { super(); } public MblDatabaseCache(String key, long date) { super(); mKey = key; mDate = date; } public static void deleteAll() { getDatabase().delete(TABLE, null, null); } public static void deleteByPrefix(String prefix) { getDatabase().delete( TABLE, COL_KEY + " LIKE ?", new String[] { prefix + "%" }); } public static void deleteByKey(String key) { getDatabase().delete( TABLE, COL_KEY + " = ?", new String[] { key }); } public static void deleteByKeys(List<String> keys) { getDatabase().beginTransaction(); for (String k : keys) { deleteByKey(k); } getDatabase().setTransactionSuccessful(); getDatabase().endTransaction(); } private static MblDatabaseCache fromCursor(Cursor cur) { MblDatabaseCache c = new MblDatabaseCache(); c.setKey(cur.getString(0)); c.setDate(cur.getLong(1)); return c; } private static ContentValues toContentValues(MblDatabaseCache c) { ContentValues values = new ContentValues(); values.put(COL_KEY, c.getKey()); values.put(COL_DATE, c.getDate()); return values; } public static void upsert(MblDatabaseCache c) { getDatabase().insertWithOnConflict( TABLE, null, toContentValues(c), SQLiteDatabase.CONFLICT_REPLACE); } public static void upsert(List<MblDatabaseCache> caches) { getDatabase().beginTransaction(); for (MblDatabaseCache c : caches) { getDatabase().insertWithOnConflict( TABLE, null, toContentValues(c), SQLiteDatabase.CONFLICT_REPLACE); } getDatabase().setTransactionSuccessful(); getDatabase().endTransaction(); } public static MblDatabaseCache get(String key) { Cursor cur = getDatabase().query( TABLE, null, COL_KEY + " = ?", new String[] { key }, null, null, null); MblDatabaseCache c = null; if (cur.moveToNext()) { c = fromCursor(cur); } cur.close(); return c; } public static List<MblDatabaseCache> getAll() { Cursor cur = getDatabase().query(TABLE, null, null, null, null, null, null); List<MblDatabaseCache> ret = new ArrayList<MblDatabaseCache>(); while (cur.moveToNext()) { ret.add(fromCursor(cur)); } cur.close(); return ret; } public static List<MblDatabaseCache> get(List<String> keys, long duration) { if (MblUtils.isEmpty(keys)) { return new ArrayList<MblDatabaseCache>(); } String[] placeholder = new String[keys.size()]; String[] selectionArgs = new String[keys.size()]; for (int i = 0; i < keys.size(); i++) { placeholder[i] = "?"; selectionArgs[i] = keys.get(i); } Cursor cur = getDatabase().query( TABLE, null, COL_KEY + " IN (" + TextUtils.join(",", placeholder) + ") AND " + COL_DATE + " + " + duration + " > " + System.currentTimeMillis(), selectionArgs, null, null, null); List<MblDatabaseCache> ret = new ArrayList<MblDatabaseCache>(); while (cur.moveToNext()) { ret.add(fromCursor(cur)); } cur.close(); return ret; } public String getKey() { return mKey; } public void setKey(String key) { mKey = key; } public long getDate() { return mDate; } public void setDate(long date) { mDate = date; } }