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.OsmWay;
import de.westnordost.osmapi.map.data.Way;
public class WayDao extends AOsmElementDao<Way>
{
private final Serializer serializer;
private final SQLiteStatement insert;
@Inject public WayDao(SQLiteOpenHelper dbHelper, Serializer serializer)
{
super(dbHelper);
this.serializer = serializer;
String sql = "INSERT OR REPLACE INTO " + WayTable.NAME + " ("+
WayTable.Columns.ID+","+
WayTable.Columns.VERSION+","+
WayTable.Columns.NODE_IDS+","+
WayTable.Columns.TAGS+
") values (?,?,?,?);";
SQLiteDatabase db = dbHelper.getWritableDatabase();
insert = db.compileStatement(sql);
}
@Override protected String getTableName()
{
return WayTable.NAME;
}
@Override protected String getIdColumnName()
{
return WayTable.Columns.ID;
}
@Override protected String getElementTypeName()
{
return Way.Type.WAY.name();
}
@Override protected void executeInsert(Way way)
{
insert.bindLong(1, way.getId());
insert.bindLong(2, way.getVersion());
insert.bindBlob(3, serializer.toBytes(new ArrayList<>(way.getNodeIds())));
if(way.getTags() != null)
{
HashMap<String,String> map = new HashMap<>();
map.putAll(way.getTags());
insert.bindBlob(4, serializer.toBytes(map));
}
else
{
insert.bindNull(4);
}
insert.executeInsert();
insert.clearBindings();
}
@Override protected Way createObjectFrom(Cursor cursor)
{
int colId = cursor.getColumnIndexOrThrow(WayTable.Columns.ID),
colNodeIds = cursor.getColumnIndexOrThrow(WayTable.Columns.NODE_IDS),
colVersion = cursor.getColumnIndexOrThrow(WayTable.Columns.VERSION),
colTags = cursor.getColumnIndexOrThrow(WayTable.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<Long> nodeIds = serializer.toObject(cursor.getBlob(colNodeIds), ArrayList.class);
return new OsmWay(id, version, nodeIds, tags);
}
}