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 java.util.ArrayList; import java.util.List; import javax.inject.Inject; import de.westnordost.streetcomplete.data.WhereSelectionBuilder; import de.westnordost.osmapi.map.data.BoundingBox; import de.westnordost.osmapi.map.data.Element; import de.westnordost.osmapi.map.data.OsmLatLon; public class CreateNoteDao { protected final SQLiteOpenHelper dbHelper; @Inject public CreateNoteDao(SQLiteOpenHelper dbHelper) { this.dbHelper = dbHelper; } public boolean add(CreateNote note) { SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(CreateNoteTable.Columns.LATITUDE, note.position.getLatitude()); values.put(CreateNoteTable.Columns.LONGITUDE, note.position.getLongitude()); if(note.elementType != null) { values.put(CreateNoteTable.Columns.ELEMENT_TYPE, note.elementType.name()); } if(note.elementId != null) { values.put(CreateNoteTable.Columns.ELEMENT_ID, note.elementId); } values.put(CreateNoteTable.Columns.TEXT, note.text); long rowId = db.insert(CreateNoteTable.NAME, null, values); if(rowId != -1) { note.id = rowId; return true; } return false; } public CreateNote get(long id) { SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query(CreateNoteTable.NAME, null, CreateNoteTable.Columns.ID + " = " + id, null, null, null, null, "1"); try { if(!cursor.moveToFirst()) return null; return createObjectFrom(cursor); } finally { cursor.close(); } } public boolean delete(long id) { SQLiteDatabase db = dbHelper.getWritableDatabase(); return db.delete(CreateNoteTable.NAME, CreateNoteTable.Columns.ID + " = " + id, null) == 1; } public List<CreateNote> getAll(BoundingBox bbox) { SQLiteDatabase db = dbHelper.getReadableDatabase(); WhereSelectionBuilder builder = new WhereSelectionBuilder(); if(bbox != null) { builder.appendAnd("(" + CreateNoteTable.Columns.LATITUDE + " BETWEEN ? AND ?)", String.valueOf(bbox.getMinLatitude()), String.valueOf(bbox.getMaxLatitude())); builder.appendAnd("(" + CreateNoteTable.Columns.LONGITUDE + " BETWEEN ? AND ?)", String.valueOf(bbox.getMinLongitude()), String.valueOf(bbox.getMaxLongitude())); } Cursor cursor = db.query(CreateNoteTable.NAME, null, builder.getWhere(), builder.getArgs(), null, null, null, null); List<CreateNote> result = new ArrayList<>(); try { if(cursor.moveToFirst()) { while(!cursor.isAfterLast()) { result.add(createObjectFrom(cursor)); cursor.moveToNext(); } } } finally { cursor.close(); } return result; } private CreateNote createObjectFrom(Cursor cursor) { int colNoteId = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.ID), colLat = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.LATITUDE), colLon = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.LONGITUDE), colText = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.TEXT), colElementType = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.ELEMENT_TYPE), colElementId = cursor.getColumnIndexOrThrow(CreateNoteTable.Columns.ELEMENT_ID); CreateNote note = new CreateNote(); note.position = new OsmLatLon(cursor.getDouble(colLat), cursor.getDouble(colLon)); note.text = cursor.getString(colText); if(!cursor.isNull(colElementType)) { note.elementType = Element.Type.valueOf(cursor.getString(colElementType)); } if(!cursor.isNull(colElementId)) { note.elementId = cursor.getLong(colElementId); } note.id = cursor.getLong(colNoteId); return note; } }