package com.buddycloud.model.dao; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.buddycloud.model.db.BuddycloudSQLiteOpenHelper; import com.buddycloud.model.db.ThreadsTableHelper; import com.buddycloud.model.db.UnreadCountersTableHelper; public class ThreadsDAO implements DAO<JSONObject, JSONObject> { private static ThreadsDAO instance; private SQLiteDatabase db; private BuddycloudSQLiteOpenHelper helper; private final String[] COLUMNS = new String[] { ThreadsTableHelper.COLUMN_ID, ThreadsTableHelper.COLUMN_UPDATED, ThreadsTableHelper.COLUMN_CHANNEL}; private ContentValues buildValues(JSONObject json) { String threadId = json.optString("id"); String threadUpdated = json.optString("updated"); String channel = json.optString("channel"); ContentValues values = new ContentValues(); values.put(ThreadsTableHelper.COLUMN_ID, threadId); values.put(ThreadsTableHelper.COLUMN_UPDATED, threadUpdated); values.put(ThreadsTableHelper.COLUMN_CHANNEL, channel); return values; } private ThreadsDAO(Context context) { this.helper = BuddycloudSQLiteOpenHelper.getInstance(context); this.db = helper.getWritableDatabase(); } public static ThreadsDAO getInstance(Context context) { if (instance == null) { instance = new ThreadsDAO(context); } return instance; } @Override public boolean insert(String threadId, JSONObject json) { ContentValues values = buildValues(json); long rowId = db.insert(ThreadsTableHelper.TABLE_NAME, null, values); return rowId != -1; } public JSONObject getNewest(String channel) { String filter = ThreadsTableHelper.COLUMN_CHANNEL + "=\"" + channel + "\""; String orderBy = "datetime(" + ThreadsTableHelper.COLUMN_UPDATED + ") DESC"; return DAOHelper.queryUniqueOnSameThread(db, false, ThreadsTableHelper.TABLE_NAME, null, filter, null, null, null, orderBy, String.valueOf(1), cursorParser()); } @Override public boolean update(String threadId, JSONObject json) { ContentValues values = buildValues(json); String channel = json.optString("channel"); String filter = ThreadsTableHelper.COLUMN_CHANNEL + "=\"" + channel + "\"" + " AND " + ThreadsTableHelper.COLUMN_ID + "=\"" + threadId + "\""; int rowsAffected = db.update(ThreadsTableHelper.TABLE_NAME, values, filter, null); return rowsAffected > 0; } private DAOCursorParser cursorParser() { DAOCursorParser cursorParser = new DAOCursorParser() { @Override public JSONObject parse(Cursor c) { return cursorToJSON(c); } }; return cursorParser; } private JSONObject cursorToJSON(Cursor cursor) { JSONObject json = new JSONObject(); try { json.put("id", getString(cursor, UnreadCountersTableHelper.COLUMN_ID)); json.put("channel", getString(cursor, ThreadsTableHelper.COLUMN_CHANNEL)); json.put("updated", getString(cursor, ThreadsTableHelper.COLUMN_UPDATED)); } catch (JSONException e) { return null; } return json; } private String getString(Cursor cursor, String columnName) { return cursor.getString(cursor.getColumnIndex(columnName)); } public JSONObject get(String threadId, String channel) { String filter = ThreadsTableHelper.COLUMN_CHANNEL + "=\"" + channel + "\"" + " AND " + ThreadsTableHelper.COLUMN_ID + "=\"" + threadId + "\""; return DAOHelper.queryUniqueOnSameThread(db, false, ThreadsTableHelper.TABLE_NAME, COLUMNS, filter, null, null, null, null, null, cursorParser()); } @Override public JSONObject get(String threadId) { // TODO Auto-generated method stub return null; } @Override public Map<String, JSONObject> getAll() { // TODO Auto-generated method stub return null; } }