package edu.mit.mitmobile2.maps; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; //import android.util.Log; import edu.mit.mitmobile2.objs.BuildingMapItem; import edu.mit.mitmobile2.objs.MapItem; import edu.mit.mitmobile2.objs.MapPoint; public class MapsDB { //private static final String TAG = "MapsDB"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "maps.db"; private static final String MAPS_TABLE = "map_items"; private static final String MAPS_VIEW = "map_items_view"; // map table field names private static final String ID = "_id"; private static final String MAP_ID = "id"; private static final String NAME = "name"; private static final String DISPLAY_NAME = "display_name"; private static final String SNIPPETS = "snippets"; private static final String STREET = "street"; private static final String FLOORPLANS = "floorplans"; private static final String BLDGIMG = "bldgimg"; private static final String VIEWANGLE = "viewangle"; private static final String BLDGNUM = "bldgnum"; private static final String LONG_WGS84 = "long_wgs84"; private static final String LAT_WGS84 = "lat_wgs84"; //private static final String ID_WHERE = ID + "=?"; private static final String MAP_ID_WHERE = MAP_ID + "=?"; SQLiteOpenHelper mMapsDBHelper; private static MapsDB mapsDBInstance = null; /********************************************************************/ public static MapsDB getInstance(Context context) { if(mapsDBInstance == null) { mapsDBInstance = new MapsDB(context); return mapsDBInstance; } else { return mapsDBInstance; } } public void close() { mMapsDBHelper.close(); } private MapsDB(Context context) { mMapsDBHelper = new MapsDatabaseHelper(context); } private String[] whereMapIdArgs(MapItem MapItem) { //return new String[] {MapItem.id}; return new String[]{""}; } private String[] whereArgs(MapItem MapItem) { String id = (String)MapItem.getItemData().get("id"); String[] args = new String[1]; args[0] = id; return args; //return new String[] {(String)MapItem.getItemData().get("id")}; } /********************************************************************/ synchronized void clearAll() { SQLiteDatabase db = mMapsDBHelper.getWritableDatabase(); db.delete(MAPS_TABLE, null, null); } synchronized void delete(MapItem mi) { SQLiteDatabase db = mMapsDBHelper.getWritableDatabase(); db.delete(MAPS_TABLE, MAP_ID_WHERE, whereArgs(mi)); db.close(); mMapsDBHelper.close(); } /********************************************************************/ void startTransaction() { mMapsDBHelper.getWritableDatabase().beginTransaction(); } void endTransaction() { mMapsDBHelper.getWritableDatabase().setTransactionSuccessful(); mMapsDBHelper.getWritableDatabase().endTransaction(); } /********************************************************************/ synchronized void saveMapItem(MapItem mi) { SQLiteDatabase db = mMapsDBHelper.getWritableDatabase(); ContentValues mapValues = new ContentValues(); mapValues.put(MAP_ID, (String)mi.getItemData().get("id")); mapValues.put(NAME, (String)mi.getItemData().get("name")); mapValues.put(DISPLAY_NAME, (String)mi.getItemData().get("displayName")); mapValues.put(SNIPPETS, (String)mi.getItemData().get("snippets")); mapValues.put(STREET, (String)mi.getItemData().get("street")); mapValues.put(FLOORPLANS, (String)mi.getItemData().get("floorplans")); mapValues.put(BLDGIMG, (String)mi.getItemData().get("bldgimg")); mapValues.put(VIEWANGLE, (String)mi.getItemData().get("viewangle")); mapValues.put(BLDGNUM, (String)mi.getItemData().get("bldgnum")); mapValues.put(LONG_WGS84, mi.getMapPoints().get(0).long_wgs84); mapValues.put(LAT_WGS84, mi.getMapPoints().get(0).lat_wgs84); long row_id; //int rows; String id = (String)mi.getItemData().get("id"); if(miExists(id)) { db.update(MAPS_TABLE, mapValues, MAP_ID_WHERE, whereMapIdArgs(mi)); } else { row_id = db.insert(MAPS_TABLE, SNIPPETS, mapValues); mi.sql_id = row_id; db.update(MAPS_TABLE, mapValues, MAP_ID_WHERE, whereMapIdArgs(mi)); } db.close(); mMapsDBHelper.close(); } /********************************************************************/ public Cursor getMapsCursor(String name) { return getMapsCursor(name, null); } public Cursor getMapsCursor(String name, String limit) { SQLiteDatabase db = mMapsDBHelper.getReadableDatabase(); String[] fields = new String[] {ID, NAME, SNIPPETS, STREET, FLOORPLANS, BLDGIMG, VIEWANGLE, BLDGNUM, LONG_WGS84, LAT_WGS84}; Cursor cursor = db.query(MAPS_VIEW, fields, NAME + "=" + name, null, null, null, ID + " DESC", limit); return cursor; } public Cursor getMapsCursor() { SQLiteDatabase db = mMapsDBHelper.getReadableDatabase(); String[] fields = new String[] { ID, MAP_ID, NAME, DISPLAY_NAME, SNIPPETS, STREET, FLOORPLANS, BLDGIMG, VIEWANGLE, BLDGNUM, LONG_WGS84, LAT_WGS84 }; Cursor cursor = db.query(MAPS_TABLE, fields, null, null, null, null, NAME + " DESC", null); return cursor; } /********************************************************************/ static MapItem retrieveMapItem(Cursor cursor) { BuildingMapItem item = new BuildingMapItem(); item.sql_id = cursor.getLong(cursor.getColumnIndex(ID)); item.getItemData().put("id", cursor.getString(cursor.getColumnIndex(MAP_ID))); item.getItemData().put("name",cursor.getString(cursor.getColumnIndex(NAME))); item.getItemData().put("displayName",cursor.getString(cursor.getColumnIndex(DISPLAY_NAME))); item.getItemData().put("snippets",cursor.getString(cursor.getColumnIndex(SNIPPETS))); item.getItemData().put("street",cursor.getString(cursor.getColumnIndex(STREET))); item.getItemData().put("floorplans",cursor.getString(cursor.getColumnIndex(FLOORPLANS))); item.getItemData().put("bldgnum",cursor.getString(cursor.getColumnIndex(BLDGNUM))); item.getItemData().put("bldgimg", cursor.getString(cursor.getColumnIndex(BLDGIMG))); item.getItemData().put("viewangle",cursor.getString(cursor.getColumnIndex(VIEWANGLE))); item.setMapPoints(new ArrayList<MapPoint>()); MapPoint mapPoint = new MapPoint(); mapPoint.lat_wgs84 = cursor.getDouble(cursor.getColumnIndex(LAT_WGS84)); mapPoint.long_wgs84 = cursor.getDouble(cursor.getColumnIndex(LONG_WGS84)); item.getMapPoints().add(mapPoint); return item; } /********************************************************************/ public MapItem retrieveMapItem(String name) { SQLiteDatabase db = mMapsDBHelper.getReadableDatabase(); Cursor cursor = db.query( MAPS_TABLE, null, MAP_ID_WHERE, new String[]{name}, null, null, null ); if (cursor.getCount()<1) return null; cursor.moveToFirst(); MapItem MapItem = retrieveMapItem(cursor); cursor.close(); mMapsDBHelper.close(); return MapItem; } /********************************************************************/ private boolean miExists(String map_id) { SQLiteDatabase db = mMapsDBHelper.getReadableDatabase(); Cursor result = db.query( MAPS_TABLE, new String[] {MAP_ID}, MAP_ID_WHERE, new String[] {map_id}, null, null, null); boolean miExists = (result.getCount() > 0); result.close(); return miExists; } /********************************************************************/ private static class MapsDatabaseHelper extends SQLiteOpenHelper { MapsDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //Log.d(TAG,"creating maps table"); db.execSQL("CREATE TABLE " + MAPS_TABLE + " (" + ID + " INTEGER PRIMARY KEY," + MAP_ID + " TEXT," + NAME + " TEXT," + DISPLAY_NAME + " TEXT," + SNIPPETS + " TEXT," + STREET + " TEXT," + FLOORPLANS + " INTEGER," + BLDGIMG + " TEXT," + VIEWANGLE + " TEXT," + BLDGNUM + " TEXT," + LONG_WGS84 + " INTEGER," + LAT_WGS84 + " INTEGER" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // no old versions exists } } synchronized void clearAllBookmarks() { this.clearAll(); } public ArrayList<MapItem> getMapItems() { Cursor cursor = this.getMapsCursor(); ArrayList<MapItem> mapItems = new ArrayList<MapItem>(); if(cursor != null && cursor.moveToFirst()) { while (cursor.isAfterLast() == false) { MapItem mapItem = MapsDB.retrieveMapItem(cursor); mapItems.add(mapItem); cursor.moveToNext(); } } return mapItems; } }