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.HashMap; import java.util.Map; import javax.inject.Inject; import de.westnordost.streetcomplete.util.Serializer; import de.westnordost.osmapi.map.data.LatLon; import de.westnordost.osmapi.map.data.Node; import de.westnordost.osmapi.map.data.OsmLatLon; import de.westnordost.osmapi.map.data.OsmNode; public class NodeDao extends AOsmElementDao<Node> { private final Serializer serializer; private final SQLiteStatement insert; @Inject public NodeDao(SQLiteOpenHelper dbHelper, Serializer serializer) { super(dbHelper); this.serializer = serializer; String sql = "INSERT OR REPLACE INTO " + NodeTable.NAME + " ("+ NodeTable.Columns.ID+","+ NodeTable.Columns.VERSION+","+ NodeTable.Columns.LATITUDE+","+ NodeTable.Columns.LONGITUDE+","+ NodeTable.Columns.TAGS+ ") values (?,?,?,?,?);"; SQLiteDatabase db = dbHelper.getWritableDatabase(); insert = db.compileStatement(sql); } @Override protected String getTableName() { return NodeTable.NAME; } @Override protected String getIdColumnName() { return NodeTable.Columns.ID; } @Override protected String getElementTypeName() { return Node.Type.NODE.name(); } @Override protected void executeInsert(Node node) { insert.bindLong(1, node.getId()); insert.bindLong(2, node.getVersion()); insert.bindDouble(3, node.getPosition().getLatitude()); insert.bindDouble(4, node.getPosition().getLongitude()); if(node.getTags() != null) { HashMap<String,String> map = new HashMap<>(); map.putAll(node.getTags()); insert.bindBlob(5, serializer.toBytes(map)); } else { insert.bindNull(5); } insert.executeInsert(); insert.clearBindings(); } @Override protected Node createObjectFrom(Cursor cursor) { int colId = cursor.getColumnIndexOrThrow(NodeTable.Columns.ID), colLat = cursor.getColumnIndexOrThrow(NodeTable.Columns.LATITUDE), colLon = cursor.getColumnIndexOrThrow(NodeTable.Columns.LONGITUDE), colVersion = cursor.getColumnIndexOrThrow(NodeTable.Columns.VERSION), colTags = cursor.getColumnIndexOrThrow(NodeTable.Columns.TAGS); long id = cursor.getLong(colId); int version = cursor.getInt(colVersion); LatLon latLon = new OsmLatLon(cursor.getDouble(colLat), cursor.getDouble(colLon)); Map<String,String> tags = null; if(!cursor.isNull(colTags)) { tags = serializer.toObject(cursor.getBlob(colTags), HashMap.class); } return new OsmNode(id, version, latLon, tags); } }