package de.westnordost.streetcomplete.data.osm.persist; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import de.westnordost.streetcomplete.util.Serializer; import de.westnordost.osmapi.map.data.OsmRelation; import de.westnordost.osmapi.map.data.Relation; import de.westnordost.osmapi.map.data.RelationMember; public class RelationDao extends AOsmElementDao<Relation> { private final Serializer serializer; private final SQLiteStatement insert; @Inject public RelationDao(SQLiteOpenHelper dbHelper, Serializer serializer) { super(dbHelper); this.serializer = serializer; String sql = "INSERT OR REPLACE INTO " + RelationTable.NAME + " ("+ RelationTable.Columns.ID+","+ RelationTable.Columns.VERSION+","+ RelationTable.Columns.MEMBERS+","+ RelationTable.Columns.TAGS+ ") values (?,?,?,?);"; SQLiteDatabase db = dbHelper.getWritableDatabase(); insert = db.compileStatement(sql); } @Override protected String getTableName() { return RelationTable.NAME; } @Override protected String getIdColumnName() { return RelationTable.Columns.ID; } @Override protected String getElementTypeName() { return Relation.Type.RELATION.name(); } @Override protected void executeInsert(Relation relation) { insert.bindLong(1, relation.getId()); insert.bindLong(2, relation.getVersion()); insert.bindBlob(3, serializer.toBytes(new ArrayList<>(relation.getMembers()))); if(relation.getTags() != null) { HashMap<String,String> map = new HashMap<>(); map.putAll(relation.getTags()); insert.bindBlob(4, serializer.toBytes(map)); } else { insert.bindNull(4); } insert.executeInsert(); insert.clearBindings(); } @Override protected Relation createObjectFrom(Cursor cursor) { int colId = cursor.getColumnIndexOrThrow(RelationTable.Columns.ID), colMembers = cursor.getColumnIndexOrThrow(RelationTable.Columns.MEMBERS), colVersion = cursor.getColumnIndexOrThrow(RelationTable.Columns.VERSION), colTags = cursor.getColumnIndexOrThrow(RelationTable.Columns.TAGS); long id = cursor.getLong(colId); int version = cursor.getInt(colVersion); Map<String,String> tags = null; if(!cursor.isNull(colTags)) { tags = serializer.toObject(cursor.getBlob(colTags), HashMap.class); } List<RelationMember> members = serializer.toObject(cursor.getBlob(colMembers), ArrayList.class); return new OsmRelation(id, version, members, tags); } }