package edu.mit.mitmobile2.people; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import edu.mit.mitmobile2.objs.PersonItem; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.BaseColumns; public class PeopleDB { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "people.db"; private static final String RECENTS_TABLE = "recents"; private static final String FIELD_SEPARATOR = "\t"; static final class RecentsTable implements BaseColumns { static final String UID = "uid"; static final String GIVENNAME = "givenname"; static final String SURNAME = "surname"; static final String DEPT = "dept"; static final String EMAIL = "email"; static final String FAX = "fax"; static final String OFFICE = "office"; static final String PHONE = "phone"; static final String TITLE = "title"; static final String LASTVIEWED = "lastViewed"; static final String LASTUPDATE = "lastUpdate"; static final String[] COLUMN_NAMES = new String[] { UID, GIVENNAME, SURNAME, DEPT, EMAIL, FAX, OFFICE, PHONE, TITLE, LASTUPDATE, LASTVIEWED }; static final String[] COLUMN_TYPES = new String[] { "TEXT UNIQUE ON CONFLICT REPLACE", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "INTEGER", "INTEGER" }; static final String NULL_HACK = UID; static final String ORDER_BY = LASTVIEWED + " DESC"; } private SQLiteOpenHelper mDBHelper; private static PeopleDB sInstance = null; public static PeopleDB getInstance(Context context) { if (sInstance == null) { sInstance = new PeopleDB(context); } return sInstance; } private PeopleDB(Context context) { mDBHelper = new PeopleDBOpenHelper(context); } public List<PersonItem> getAllAsList() { ArrayList<PersonItem> items = new ArrayList<PersonItem>(); Cursor c = getAllRecords(); c.moveToFirst(); for (int row = 0; row < c.getCount(); row++) { PersonItem person = personFromCursor(c); items.add(person); c.moveToNext(); } c.close(); return items; } public Cursor getAllRecords() { SQLiteDatabase db = mDBHelper.getReadableDatabase(); Cursor cursor = db.query( RECENTS_TABLE, RecentsTable.COLUMN_NAMES, null, null, null, null, RecentsTable.ORDER_BY); return cursor; } public PersonItem getRecord(String uid) { PersonItem person = null; SQLiteDatabase db = mDBHelper.getReadableDatabase(); Cursor cursor = db.query(RECENTS_TABLE, RecentsTable.COLUMN_NAMES, null, null, null, null, null); cursor.moveToFirst(); if (cursor.getCount() > 0) { person = personFromCursor(cursor); } cursor.close(); return person; } synchronized void addPerson(PersonItem person) { SQLiteDatabase db = mDBHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(RecentsTable.UID, person.uid); values.put(RecentsTable.GIVENNAME, stringFromList(person.givenname)); values.put(RecentsTable.SURNAME, stringFromList(person.surname)); values.put(RecentsTable.DEPT, stringFromList(person.dept)); values.put(RecentsTable.EMAIL, stringFromList(person.email)); values.put(RecentsTable.FAX, stringFromList(person.fax)); values.put(RecentsTable.OFFICE, stringFromList(person.office)); values.put(RecentsTable.PHONE, stringFromList(person.phone)); values.put(RecentsTable.TITLE, stringFromList(person.title)); values.put(RecentsTable.LASTUPDATE, (int)(person.lastUpdate.getTime() / 1000)); values.put(RecentsTable.LASTVIEWED, (int)(person.lastViewed.getTime() / 1000)); db.insert(RECENTS_TABLE, RecentsTable.NULL_HACK, values); } synchronized void clearAll() { SQLiteDatabase db = mDBHelper.getWritableDatabase(); db.delete(RECENTS_TABLE, null, null); } private static PersonItem personFromCursor(Cursor cursor) { PersonItem person = new PersonItem(); person.uid = cursor.getString(cursor.getColumnIndex(RecentsTable.UID)); person.givenname = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.GIVENNAME))); person.surname = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.SURNAME))); person.dept = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.DEPT))); person.email = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.EMAIL))); person.fax = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.FAX))); person.office = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.OFFICE))); person.phone = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.PHONE))); person.title = listFromString( cursor.getString(cursor.getColumnIndex(RecentsTable.TITLE))); person.lastUpdate = new Date(cursor.getInt(cursor.getColumnIndex(RecentsTable.LASTUPDATE)) * 1000); person.lastViewed = new Date(cursor.getInt(cursor.getColumnIndex(RecentsTable.LASTVIEWED)) * 1000); return person; } private static String stringFromList(List<String> aList) { StringBuffer sb = new StringBuffer(); int size = aList.size(); for (int i = 0; i < size; i++) { sb.append(aList.get(i)); if (i != size - 1) { sb.append(FIELD_SEPARATOR); } } return sb.toString(); } private static List<String> listFromString(String aString) { if (aString.length() == 0) return new ArrayList<String>(); return Arrays.asList(aString.split(FIELD_SEPARATOR)); } private static class PeopleDBOpenHelper extends SQLiteOpenHelper { public PeopleDBOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { StringBuilder builder = new StringBuilder(); builder.append("CREATE TABLE " + RECENTS_TABLE + " ("); builder.append(RecentsTable._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"); for (int i = 0; i < RecentsTable.COLUMN_NAMES.length; i++) { String name = RecentsTable.COLUMN_NAMES[i]; String type = RecentsTable.COLUMN_TYPES[i]; builder.append(name + " " + type); if (i != RecentsTable.COLUMN_NAMES.length - 1) { builder.append(","); } } builder.append(");"); db.execSQL(builder.toString()); } @Override public void onUpgrade(SQLiteDatabase db, int oldVesion, int newVersion) { throw new UnsupportedOperationException(); } } }