package de.westnordost.streetcomplete.data.osmnotes; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import java.util.Date; import java.util.List; import javax.inject.Inject; import de.westnordost.streetcomplete.data.AQuestDao; import de.westnordost.streetcomplete.data.QuestStatus; import de.westnordost.streetcomplete.data.WhereSelectionBuilder; import de.westnordost.streetcomplete.util.Serializer; import de.westnordost.osmapi.map.data.BoundingBox; import de.westnordost.osmapi.map.data.LatLon; import de.westnordost.osmapi.map.data.OsmLatLon; import de.westnordost.osmapi.notes.Note; public class OsmNoteQuestDao extends AQuestDao<OsmNoteQuest> { private final Serializer serializer; private final SQLiteStatement add, replace; @Inject public OsmNoteQuestDao(SQLiteOpenHelper dbHelper, Serializer serializer) { super(dbHelper); this.serializer = serializer; String sql = OsmNoteQuestTable.NAME + " ("+ OsmNoteQuestTable.Columns.QUEST_ID+","+ OsmNoteQuestTable.Columns.NOTE_ID+","+ OsmNoteQuestTable.Columns.QUEST_STATUS+","+ OsmNoteQuestTable.Columns.COMMENT+","+ OsmNoteQuestTable.Columns.LAST_UPDATE+ ") values (?,?,?,?,?);"; SQLiteDatabase db = dbHelper.getWritableDatabase(); add = db.compileStatement("INSERT OR IGNORE INTO " + sql); replace = db.compileStatement("INSERT OR REPLACE INTO " +sql); } public List<LatLon> getAllPositions(BoundingBox bbox) { String[] cols = { NoteTable.Columns.LATITUDE, NoteTable.Columns.LONGITUDE }; WhereSelectionBuilder qb = new WhereSelectionBuilder(); addBBox(bbox, qb); return getAllThings(getMergedViewName(), cols, qb, new CreateFromCursor<LatLon>() { @Override public LatLon create(Cursor cursor) { return new OsmLatLon(cursor.getDouble(0), cursor.getDouble(1)); } }); } @Override protected String getTableName() { return OsmNoteQuestTable.NAME; } @Override protected String getMergedViewName() { return OsmNoteQuestTable.NAME_MERGED_VIEW; } @Override protected String getIdColumnName() { return OsmNoteQuestTable.Columns.QUEST_ID; } @Override protected String getLatitudeColumnName() { return NoteTable.Columns.LATITUDE; } @Override protected String getLongitudeColumnName() { return NoteTable.Columns.LONGITUDE; } @Override protected String getQuestStatusColumnName() { return OsmNoteQuestTable.Columns.QUEST_STATUS; } @Override protected synchronized long executeInsert(OsmNoteQuest quest, boolean replace) { SQLiteStatement stmt = replace ? this.replace : this.add; if(quest.getId() != null) { stmt.bindLong(1, quest.getId()); } else { stmt.bindNull(1); } stmt.bindLong(2, quest.getNote().id); stmt.bindString(3, quest.getStatus().name()); if(quest.getComment() != null) { stmt.bindString(4, quest.getComment()); } else { stmt.bindNull(4); } stmt.bindLong(5, quest.getLastUpdate().getTime()); long result = stmt.executeInsert(); stmt.clearBindings(); return result; } @Override protected ContentValues createNonFinalContentValuesFrom(OsmNoteQuest quest) { ContentValues values = new ContentValues(); values.put(OsmNoteQuestTable.Columns.QUEST_STATUS, quest.getStatus().name()); values.put(OsmNoteQuestTable.Columns.LAST_UPDATE, quest.getLastUpdate().getTime()); if(quest.getComment() != null) { values.put(OsmNoteQuestTable.Columns.COMMENT, quest.getComment()); } return values; } @Override protected ContentValues createFinalContentValuesFrom(OsmNoteQuest quest) { ContentValues values = new ContentValues(); if(quest.getNote() != null) { values.put(OsmNoteQuestTable.Columns.NOTE_ID, quest.getNote().id); } return values; } @Override protected OsmNoteQuest createObjectFrom(Cursor cursor) { int colQuestId = cursor.getColumnIndexOrThrow(OsmNoteQuestTable.Columns.QUEST_ID), colNoteId = cursor.getColumnIndexOrThrow(OsmNoteQuestTable.Columns.NOTE_ID), colQuestStatus = cursor.getColumnIndexOrThrow(OsmNoteQuestTable.Columns.QUEST_STATUS), colComment = cursor.getColumnIndexOrThrow(OsmNoteQuestTable.Columns.COMMENT), colLastUpdate = cursor.getColumnIndexOrThrow(OsmNoteQuestTable.Columns.LAST_UPDATE); long questId = cursor.getLong(colQuestId); String comment = null; if(!cursor.isNull(colComment)) { comment = cursor.getString(colComment); } QuestStatus status = QuestStatus.valueOf(cursor.getString(colQuestStatus)); Date lastUpdate = new Date(cursor.getLong(colLastUpdate)); Note note = null; if(!cursor.isNull(colNoteId)) { note = NoteDao.createObjectFrom(serializer, cursor); } return new OsmNoteQuest(questId, note, status, comment, lastUpdate); } }