package org.maepaysoh.maepaysohsdk.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import org.maepaysoh.maepaysohsdk.models.Candidate; import org.maepaysoh.maepaysohsdk.models.Constituency; import org.maepaysoh.maepaysohsdk.models.Father; import org.maepaysoh.maepaysohsdk.models.Mother; import static org.maepaysoh.maepaysohsdk.utils.Logger.LOGE; import static org.maepaysoh.maepaysohsdk.utils.Logger.makeLogTag; /** * Created by yemyatthu on 8/7/15. */ // TODO: 8/7/15 USE SQL RELATIONSHIP IN PLACE OF JSON SERIALIZATION public class CandidateDao { private SQLiteDatabase mMaepaysohDb; private MaepaysohDbHelper mMaepaysohDbHelper; private static final String TAG = makeLogTag(CandidateDao.class); public CandidateDao(Context context) { mMaepaysohDbHelper = new MaepaysohDbHelper(context); } public void open() throws SQLException { mMaepaysohDb = mMaepaysohDbHelper.getWritableDatabase(); } public void close() throws SQLException { mMaepaysohDbHelper.close(); } public boolean createCandidate(Candidate candidate) throws SQLException { Gson gson = new Gson(); open(); ContentValues candidateContentValues = new ContentValues(); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_ID, candidate.getId()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_NAME, candidate.getName()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_NATIONALITY_RELIGION, candidate.getReligion()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_BIRTHDATE, (long) candidate.getBirthdate()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_EDUCATION, candidate.getEducation()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_OCCUPATION, candidate.getOccupation()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_LEGISLATURE, candidate.getLegislature()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_RESIDENCY,candidate.getWardVillage()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_CONSTITUENCY, gson.toJson(candidate.getConstituency())); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_MOTHER, gson.toJson(candidate.getMother())); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_FATHER, gson.toJson(candidate.getFather())); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_PARTY_ID, candidate.getPartyId()); candidateContentValues.put(MaepaysohDbHelper.COLUMN_CANDIDATE_PHOTO_URL,candidate.getPhotoUrl()); mMaepaysohDb.beginTransaction(); try { long insertId = mMaepaysohDb.insertWithOnConflict(MaepaysohDbHelper.TABLE_NAME_CANDIDATE, null, candidateContentValues, SQLiteDatabase.CONFLICT_REPLACE); mMaepaysohDb.setTransactionSuccessful(); } catch (SQLiteException e) { LOGE(TAG, e.getLocalizedMessage()); } finally { mMaepaysohDb.endTransaction(); } return true; } public List<Candidate> getAllCandidateData() throws SQLException { open(); List<Candidate> candidates = new ArrayList<>(); Cursor cursor = mMaepaysohDb.query(MaepaysohDbHelper.TABLE_NAME_CANDIDATE, null, null, null, null, null, null); cursor.moveToFirst(); while (!cursor.isAfterLast()) { Candidate candidate = cursorToCandidate(cursor); candidates.add(candidate); cursor.moveToNext(); } cursor.close(); close(); return candidates; } public Candidate getCandidateById(String id) throws SQLException { open(); Cursor cursor = mMaepaysohDb.query(MaepaysohDbHelper.TABLE_NAME_CANDIDATE, null, MaepaysohDbHelper.COLUMN_CANDIDATE_ID + " = " + id, null, null, null, null); Candidate candidate = cursorToCandidate(cursor); cursor.close(); close(); return candidate; } private Candidate cursorToCandidate(Cursor cursor) { Gson gson = new Gson(); Type type = new TypeToken<List<String>>() { }.getType(); Candidate candidate = new Candidate(); candidate.setId( cursor.getString(cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_ID))); candidate.setName( cursor.getString(cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_NAME))); //candidate.setNationalId(cursor.getString( // cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_NATIONAL_ID))); candidate.setBirthdate((int) cursor.getLong( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_BIRTHDATE))); candidate.setConstituency(gson.fromJson(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_CONSTITUENCY)), Constituency.class)); candidate.setEducation(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_EDUCATION))); candidate.setEducation(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_EDUCATION))); candidate.setFather(gson.fromJson( cursor.getString(cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_FATHER)), Father.class)); candidate.setMother(gson.fromJson( cursor.getString(cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_MOTHER)), Mother.class)); candidate.setLegislature(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_LEGISLATURE))); candidate.setReligion(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_NATIONALITY_RELIGION))); candidate.setPartyId(cursor.getInt( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_PARTY_ID))); candidate.setWardVillage(cursor.getString( cursor.getColumnIndexOrThrow(MaepaysohDbHelper.COLUMN_CANDIDATE_RESIDENCY))); return candidate; } public List<Candidate> searchCandidatesFromDb(String keyword) { open(); List<Candidate> candidates = new ArrayList<>(); Cursor cursor = mMaepaysohDb.query(MaepaysohDbHelper.TABLE_NAME_CANDIDATE, null, MaepaysohDbHelper.COLUMN_CANDIDATE_NAME + " LIKE " + "'%" + keyword + "%'", null, null, null, null); if (cursor.moveToFirst()) { while (!cursor.isAfterLast()) { Candidate candidate = cursorToCandidate(cursor); candidates.add(candidate); cursor.moveToNext(); } } cursor.close(); close(); return candidates; } }