package ph.devcon.android.attendee.db; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.google.common.base.Optional; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import ph.devcon.android.base.DatabaseHelper; import ph.devcon.android.user.db.User; import ph.devcon.android.util.Util; /** * Created by lope on 11/21/14. */ public class FTSAttendee { public static final String TABLE_ATTENDEE_FTS = "ATTENDEE_FTS"; public static final String COL_ID = "_id"; public static final String COL_EMAIL = "COL_EMAIL"; public static final String COL_FULL_NAME = "COL_FULL_NAME"; public static final String COL_POSITION = "COL_POSITION"; public static final String COL_COMPANY = "COL_COMPANY"; public static final String COL_LOCATION = "COL_LOCATION"; public static final String COL_CONTACT_NUMBER = "COL_CONTACT_NUMBER"; public static final String COL_DESCRIPTION = "COL_DESCRIPTION"; public static final String COL_WEBSITE = "COL_WEBSITE"; public static final String COL_FACEBOOK_URL = "COL_FACEBOOK_URL"; public static final String COL_TWITTER_HANDLE = "COL_TWITTER_HANDLE"; public static final String COL_TECH_PRIMARY = "COL_TECH_PRIMARY"; public static final String COL_TECH_2 = "COL_TECH_2"; public static final String COL_TECH_3 = "COL_TECH_3"; public static final String COL_PHOTO_URL = "COL_PHOTO_URL"; private static final String TAG = FTSAttendee.class.getName(); private static FTSAttendee mInstance; DatabaseHelper helper; private FTSAttendee() { } private FTSAttendee(DatabaseHelper helper) { this.helper = helper; } public static FTSAttendee getInstance(DatabaseHelper helper) { /** * use the application context as suggested by CommonsWare. * this will ensure that you dont accidentally leak an Activitys * context (see this article for more information: * http://developer.android.com/resources/articles/avoiding-memory-leaks.html) */ if (mInstance == null) { mInstance = new FTSAttendee(helper); } return mInstance; } public static String buildTable() { return "CREATE VIRTUAL TABLE " + TABLE_ATTENDEE_FTS + " USING fts3(" + COL_ID + ", " + COL_EMAIL + ", " + COL_FULL_NAME + ", " + COL_POSITION + ", " + COL_COMPANY + ", " + COL_LOCATION + ", " + COL_CONTACT_NUMBER + ", " + COL_DESCRIPTION + ", " + COL_WEBSITE + ", " + COL_FACEBOOK_URL + ", " + COL_TWITTER_HANDLE + ", " + COL_TECH_PRIMARY + ", " + COL_TECH_2 + ", " + COL_TECH_3 + ", " + COL_PHOTO_URL + ", " + ");"; } public static String dropTable() { return "DROP TABLE " + TABLE_ATTENDEE_FTS + ";"; } public static void clear() { // TODO } public void create(Attendee attendee) { create(helper.getReadableDatabase(), attendee); } public void create(SQLiteDatabase database, Attendee attendee) { ContentValues contentValues = new ContentValues(); User user = attendee.getUser(); if (Optional.of(user).isPresent()) { contentValues.put(COL_ID, attendee.getId()); contentValues.put(COL_EMAIL, user.getEmail()); contentValues.put(COL_FULL_NAME, user.getFullName()); contentValues.put(COL_POSITION, user.getPosition()); contentValues.put(COL_COMPANY, user.getCompany()); contentValues.put(COL_LOCATION, user.getLocation()); contentValues.put(COL_CONTACT_NUMBER, user.getContactNumber()); contentValues.put(COL_WEBSITE, user.getWebsite()); contentValues.put(COL_FACEBOOK_URL, user.getFacebookUrl()); contentValues.put(COL_TWITTER_HANDLE, user.getTwitterHandle()); contentValues.put(COL_TECH_PRIMARY, user.getPrettyMainTechnology()); contentValues.put(COL_TECH_2, user.getPrettyTechnologyList()); contentValues.put(COL_TECH_3, user.getPrettyTechnologyList()); contentValues.put(COL_PHOTO_URL, user.getPhotoUrl()); database.insert(TABLE_ATTENDEE_FTS, null, contentValues); } } public void update(Attendee attendee) { update(helper.getReadableDatabase(), attendee); } public void update(SQLiteDatabase database, Attendee attendee) { ContentValues contentValues = new ContentValues(); User user = attendee.getUser(); if (Optional.of(user).isPresent()) { contentValues.put(COL_ID, attendee.getId()); contentValues.put(COL_EMAIL, user.getEmail()); contentValues.put(COL_FULL_NAME, user.getFullName()); contentValues.put(COL_POSITION, user.getPosition()); contentValues.put(COL_COMPANY, user.getCompany()); contentValues.put(COL_LOCATION, user.getLocation()); contentValues.put(COL_CONTACT_NUMBER, user.getContactNumber()); contentValues.put(COL_WEBSITE, user.getWebsite()); contentValues.put(COL_FACEBOOK_URL, user.getFacebookUrl()); contentValues.put(COL_TWITTER_HANDLE, user.getTwitterHandle()); contentValues.put(COL_TECH_PRIMARY, user.getPrettyMainTechnology()); contentValues.put(COL_TECH_2, user.getPrettyTechnologyList()); contentValues.put(COL_TECH_3, user.getPrettyTechnologyList()); contentValues.put(COL_PHOTO_URL, user.getPhotoUrl()); database.insert(TABLE_ATTENDEE_FTS, null, contentValues); database.update(TABLE_ATTENDEE_FTS, contentValues, "_id = " + String.valueOf(attendee.getId()), null); } } public void delete(Attendee attendee) { delete(helper.getReadableDatabase(), attendee); } public void delete(SQLiteDatabase database, Attendee attendee) { database.delete(TABLE_ATTENDEE_FTS, "_id = " + String.valueOf(attendee.getId()), null); } public Cursor search(String query) { assert !Util.isNullOrEmpty(query) : "query must not be an empty string!"; SQLiteDatabase database = helper.getReadableDatabase(); Cursor cursor = database.query(TABLE_ATTENDEE_FTS, new String[]{ COL_ID, COL_FULL_NAME, COL_POSITION, COL_COMPANY, COL_PHOTO_URL, COL_TECH_PRIMARY}, TABLE_ATTENDEE_FTS + " MATCH ?", new String[]{appendWildcard(query)}, null, null, null); return cursor; } public Cursor queryForAll() { SQLiteDatabase database = helper.getReadableDatabase(); Cursor cursor = database.query(TABLE_ATTENDEE_FTS, new String[]{ COL_ID, COL_FULL_NAME, COL_POSITION, COL_COMPANY, COL_PHOTO_URL, COL_TECH_PRIMARY}, COL_ID + "=?", new String[]{"*"}, null, null, null); String countQuery = "SELECT * FROM " + TABLE_ATTENDEE_FTS; cursor = database.rawQuery(countQuery, null); return cursor; } public Cursor queryEmpty() { SQLiteDatabase database = helper.getReadableDatabase(); Cursor cursor = database.query(TABLE_ATTENDEE_FTS, new String[]{ COL_ID, COL_FULL_NAME, COL_POSITION, COL_COMPANY, COL_PHOTO_URL, COL_TECH_PRIMARY}, COL_ID + "=?", new String[]{"0"}, null, null, null); // String countQuery = "SELECT * FROM " + TABLE_ATTENDEE_FTS; // cursor = database.rawQuery(countQuery, null); return cursor; } private String appendWildcard(String query) { if (Util.isNullOrEmpty(query)) return query; final StringBuilder builder = new StringBuilder(); final String[] splits = Iterables.toArray(Splitter.on(" ").split(query), String.class); for (String split : splits) builder.append(split).append("*").append(" "); return builder.toString().trim(); } }