package br.com.while42.rpgcs.persist.dao; import java.util.ArrayList; import java.util.List; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.provider.BaseColumns; import android.util.Log; import br.com.while42.rpgcs.model.character.RpgCharacter; import br.com.while42.rpgcs.persist.TableColumnsUtils; import br.com.while42.rpgcs.persist.table.RpgCharacterTable; import br.com.while42.rpgcs.persist.table.RpgCharacterTable.RpgCharacterColumns; public class RpgCharacterDAO implements Dao<RpgCharacter> { private static final String INSERT = "INSERT INTO " + RpgCharacterTable.NAME + "(" + new TableColumnsUtils().getAsCommaSeparatedStringWithoutFirstColumn(RpgCharacterColumns.get()) + ") VALUES " + new TableColumnsUtils().getQuestionMarksWithoutFirstColumn(RpgCharacterColumns.get()); private SQLiteDatabase db; private SQLiteStatement insertStatement; public RpgCharacterDAO(SQLiteDatabase db) { this.db = db; insertStatement = db.compileStatement(INSERT); } @Override public Long save(RpgCharacter rpgCharacter) { if (rpgCharacter.getId() == 0) { //db.insert(RpgCharacterTable.NAME, nullColumnHack, values) insertStatement.clearBindings(); insertStatement.bindString(1, rpgCharacter.getCharacteristics().getName()); insertStatement.bindLong(2, RpgCharacter.getSerialVersionUID()); insertStatement.bindBlob(3, RpgCharacter.serialize(rpgCharacter)); rpgCharacter.setId(insertStatement.executeInsert()); } else { this.update(rpgCharacter); } return rpgCharacter.getId(); } @Override public void update(RpgCharacter rpgCharacter) { db.update(RpgCharacterTable.NAME, RpgCharacterTable.toContentValues(rpgCharacter), BaseColumns._ID + " = ?", new String[] { String.valueOf(rpgCharacter.getId()) }); } @Override public void delete(RpgCharacter rpgCharacter) { if (rpgCharacter.isPersistent()) { db.delete(RpgCharacterTable.NAME, BaseColumns._ID + " = ?", new String[] { String.valueOf(rpgCharacter.getId()) }); rpgCharacter.setId(0L); } } @Override public RpgCharacter retrieve(Long id) { RpgCharacter rpgCharacter = null; Cursor cursor = db.query(RpgCharacterTable.NAME, RpgCharacterColumns.get(), BaseColumns._ID + " = ?", // where new String[] { id.toString() }, // values null, // group by null, // having null, // order by "1"); // limit if (cursor.moveToFirst()) { rpgCharacter = this.buildRpgCharacterFromCursor(cursor); } if (!cursor.isClosed()) { cursor.close(); } return rpgCharacter; } @Override public List<RpgCharacter> retrieveAll() { List<RpgCharacter> myList = new ArrayList<RpgCharacter>(); Cursor cursor = db.query(RpgCharacterTable.NAME, RpgCharacterColumns.get(), null, // where null, // values null, // group by null, // having RpgCharacterColumns.NAME, // order by null); // limit if (cursor.moveToFirst()) { do { RpgCharacter rpgCharacter = this.buildRpgCharacterFromCursor(cursor); myList.add(rpgCharacter); } while (cursor.moveToNext()); } if (!cursor.isClosed()) { cursor.close(); } return myList; } private RpgCharacter buildRpgCharacterFromCursor(Cursor cursor) { RpgCharacter rpgCharacter = null; if (cursor != null) { long atual = RpgCharacter.getSerialVersionUID(); long retrieve = cursor.getLong(2); if (atual != retrieve) { Log.e("ERROR", "Diferente Serial Version UID! [atual: " + atual + ", retrieve: " + retrieve + "]"); return null; } rpgCharacter = RpgCharacter.deserialize(cursor.getBlob(3)); rpgCharacter.setId(cursor.getLong(0)); } return rpgCharacter; } }