diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2011-09-09 22:41:57 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2011-09-09 22:45:17 +0200 |
| commit | d01ff869025c5d83f438f04fca6bbf19bbfc5ce5 (patch) | |
| tree | c1ed669cda1165b6be4a689f25d07cc4ece35d5d /src/cgeo/geocaching/cgData.java | |
| parent | 820ba2f83ddd488bc5809ce31cf0a718143a1419 (diff) | |
| parent | 09dd423be6c182d434aa3e20330ee1866a0b0aef (diff) | |
| download | cgeo-d01ff869025c5d83f438f04fca6bbf19bbfc5ce5.zip cgeo-d01ff869025c5d83f438f04fca6bbf19bbfc5ce5.tar.gz cgeo-d01ff869025c5d83f438f04fca6bbf19bbfc5ce5.tar.bz2 | |
Merge branch 'master' into use-geopoint-391
Conflicts:
src/cgeo/geocaching/cgData.java
Diffstat (limited to 'src/cgeo/geocaching/cgData.java')
| -rw-r--r-- | src/cgeo/geocaching/cgData.java | 278 |
1 files changed, 145 insertions, 133 deletions
diff --git a/src/cgeo/geocaching/cgData.java b/src/cgeo/geocaching/cgData.java index 9329ff2..940ef09 100644 --- a/src/cgeo/geocaching/cgData.java +++ b/src/cgeo/geocaching/cgData.java @@ -35,6 +35,13 @@ import cgeo.geocaching.utils.CollectionUtils; public class cgData { + /**The list of fields needed for mapping.*/ + private static final String[] CACHE_COLUMNS = new String[]{ + "_id", "updated", "reason", "detailed", "detailedupdate", "visiteddate", "geocode", "cacheid", "guid", "type", "name", "own", "owner", "owner_real", "hidden", "hint", "size", + "difficulty", "distance", "direction", "terrain", "latlon", "latitude_string", "longitude_string", "location", "latitude", "longitude", "elevation", "shortdesc", + "description", "favourite_cnt", "rating", "votes", "myvote", "disabled", "archived", "members", "found", "favourite", "inventorycoins", "inventorytags", + "inventoryunknown", "onWatchlist", "personal_note", "reliable_latlon" + }; public cgCacheWrap caches; private Context context = null; private String path = null; @@ -1016,6 +1023,8 @@ public class cgData { } } + + @Deprecated public boolean isReliableLatLon(String geocode, String guid) { init(); @@ -1196,7 +1205,7 @@ public class cgData { values.put("distance", cache.distance); values.put("direction", cache.direction); // save coordinates - final boolean rel = isReliableLatLon(cache.geocode, cache.guid); + final boolean rel = cache.reliableLatLon; if (cache.reliableLatLon) { // new cache has reliable coordinates, store values.put("latitude", cache.coords.getLatitude()); values.put("longitude", cache.coords.getLongitude()); @@ -1713,6 +1722,19 @@ public class cgData { return loadCache(geocode, guid, false, true, false, false, false, false); } + /** + * Loads a single Cache. + * @param geocode The Geocode GCXXXX + * @param guid + * @param loadA + * @param loadW + * @param loadS + * @param loadL + * @param loadI + * @param loadO + * @return the loaded cache + */ + public cgCache loadCache(String geocode, String guid, boolean loadA, boolean loadW, boolean loadS, boolean loadL, boolean loadI, boolean loadO) { Object[] geocodes = new Object[1]; Object[] guids = new Object[1]; @@ -1729,7 +1751,7 @@ public class cgData { guids = null; } - List<cgCache> caches = loadCaches(geocodes, guids, null, null, null, null, loadA, loadW, loadS, loadL, loadI, loadO); + List<cgCache> caches = loadCaches(geocodes, null, null, null, null, null, loadA, loadW, loadS, loadL, loadI, loadO); if (caches != null && caches.isEmpty() == false) { return caches.get(0); } @@ -1751,7 +1773,17 @@ public class cgData { public List<cgCache> loadCaches(Object[] geocodes, Object[] guids, Long centerLat, Long centerLon, Long spanLat, Long spanLon, boolean loadA, boolean loadW, boolean loadS, boolean loadL, boolean loadI, boolean loadO) { init(); - +// Using more than one of the parametersets results in overly comlex wheres + if (((geocodes != null && geocodes.length > 0) && (guids != null && guids.length > 0))) { + throw new IllegalArgumentException("Please use only one parameter"); + } + if (((geocodes != null && geocodes.length > 0) || (guids != null && guids.length > 0)) + && centerLat != null + && centerLon != null + && spanLat != null + && spanLon != null) { + throw new IllegalArgumentException("Please use only one parameter"); + } StringBuilder where = new StringBuilder(); Cursor cursor = null; List<cgCache> caches = new ArrayList<cgCache>(); @@ -1827,15 +1859,9 @@ public class cgData { where.append(String.format((Locale) null, "%.6f", lonMax)); where.append(')'); } - cursor = databaseRO.query( dbTableCaches, - new String[]{ - "_id", "updated", "reason", "detailed", "detailedupdate", "visiteddate", "geocode", "cacheid", "guid", "type", "name", "own", "owner", "owner_real", "hidden", "hint", "size", - "difficulty", "distance", "direction", "terrain", "latlon", "latitude_string", "longitude_string", "location", "latitude", "longitude", "elevation", "shortdesc", - "description", "favourite_cnt", "rating", "votes", "myvote", "disabled", "archived", "members", "found", "favourite", "inventorycoins", "inventorytags", - "inventoryunknown", "onWatchlist", "personal_note" - }, + CACHE_COLUMNS, where.toString(), null, null, @@ -1844,77 +1870,12 @@ public class cgData { null); if (cursor != null) { - int index = 0; - if (cursor.getCount() > 0) { cursor.moveToFirst(); do { - cgCache cache = new cgCache(); - - cache.updated = (long) cursor.getLong(cursor.getColumnIndex("updated")); - cache.reason = (int) cursor.getInt(cursor.getColumnIndex("reason")); - cache.detailed = cursor.getInt(cursor.getColumnIndex("detailed")) == 1; - cache.detailedUpdate = (Long) cursor.getLong(cursor.getColumnIndex("detailedupdate")); - cache.visitedDate = (Long) cursor.getLong(cursor.getColumnIndex("visiteddate")); - cache.geocode = (String) cursor.getString(cursor.getColumnIndex("geocode")); - cache.cacheid = (String) cursor.getString(cursor.getColumnIndex("cacheid")); - cache.guid = (String) cursor.getString(cursor.getColumnIndex("guid")); - cache.type = (String) cursor.getString(cursor.getColumnIndex("type")); - cache.name = (String) cursor.getString(cursor.getColumnIndex("name")); - cache.own = cursor.getInt(cursor.getColumnIndex("own")) == 1; - cache.owner = (String) cursor.getString(cursor.getColumnIndex("owner")); - cache.ownerReal = (String) cursor.getString(cursor.getColumnIndex("owner_real")); - cache.hidden = new Date((long) cursor.getLong(cursor.getColumnIndex("hidden"))); - cache.hint = (String) cursor.getString(cursor.getColumnIndex("hint")); - cache.size = (String) cursor.getString(cursor.getColumnIndex("size")); - cache.difficulty = (Float) cursor.getFloat(cursor.getColumnIndex("difficulty")); - index = cursor.getColumnIndex("direction"); - if (cursor.isNull(index)) { - cache.direction = null; - } else { - cache.direction = (Double) cursor.getDouble(index); - } - index = cursor.getColumnIndex("distance"); - if (cursor.isNull(index)) { - cache.distance = null; - } else { - cache.distance = (Double) cursor.getDouble(index); - } - cache.terrain = (Float) cursor.getFloat(cursor.getColumnIndex("terrain")); - cache.latlon = (String) cursor.getString(cursor.getColumnIndex("latlon")); - cache.latitudeString = (String) cursor.getString(cursor.getColumnIndex("latitude_string")); - cache.longitudeString = (String) cursor.getString(cursor.getColumnIndex("longitude_string")); - cache.location = (String) cursor.getString(cursor.getColumnIndex("location")); - - final int indexLat = cursor.getColumnIndex("latitude"); - final int indexLon = cursor.getColumnIndex("longitude"); - if (cursor.isNull(indexLat) || cursor.isNull(indexLon)) { - cache.coords = null; - } else { - cache.coords = new Geopoint(cursor.getDouble(indexLat), cursor.getDouble(indexLon));; - } - - index = cursor.getColumnIndex("elevation"); - if (cursor.isNull(index)) { - cache.elevation = null; - } else { - cache.elevation = (Double) cursor.getDouble(index); - } - cache.personalNote = (String) cursor.getString(cursor.getColumnIndex("personal_note")); - cache.shortdesc = (String) cursor.getString(cursor.getColumnIndex("shortdesc")); - cache.description = (String) cursor.getString(cursor.getColumnIndex("description")); - cache.favouriteCnt = (Integer) cursor.getInt(cursor.getColumnIndex("favourite_cnt")); - cache.rating = (Float) cursor.getFloat(cursor.getColumnIndex("rating")); - cache.votes = (Integer) cursor.getInt(cursor.getColumnIndex("votes")); - cache.myVote = (Float) cursor.getFloat(cursor.getColumnIndex("myvote")); - cache.disabled = cursor.getLong(cursor.getColumnIndex("disabled")) == 1L; - cache.archived = cursor.getLong(cursor.getColumnIndex("archived")) == 1L; - cache.members = cursor.getLong(cursor.getColumnIndex("members")) == 1L; - cache.found = cursor.getLong(cursor.getColumnIndex("found")) == 1L; - cache.favourite = cursor.getLong(cursor.getColumnIndex("favourite")) == 1L; - cache.inventoryItems = (Integer) cursor.getInt(cursor.getColumnIndex("inventoryunknown")); - cache.onWatchlist = cursor.getLong(cursor.getColumnIndex("onWatchlist")) == 1L; + //Extracted Method + cgCache cache = createCacheFromDatabaseContent(cursor); if (loadA) { List<String> attributes = loadAttributes(cache.geocode); @@ -2001,6 +1962,81 @@ public class cgData { return caches; } + /** + * maps a Cache from the cursor. Doesn't next. + * @param cursor + * @return + */ + + private static cgCache createCacheFromDatabaseContent(Cursor cursor) { + int index; + cgCache cache = new cgCache(); + + cache.updated = (long) cursor.getLong(cursor.getColumnIndex("updated")); + cache.reason = (int) cursor.getInt(cursor.getColumnIndex("reason")); + cache.detailed = cursor.getInt(cursor.getColumnIndex("detailed")) == 1; + cache.detailedUpdate = (Long) cursor.getLong(cursor.getColumnIndex("detailedupdate")); + cache.visitedDate = (Long) cursor.getLong(cursor.getColumnIndex("visiteddate")); + cache.geocode = (String) cursor.getString(cursor.getColumnIndex("geocode")); + cache.cacheid = (String) cursor.getString(cursor.getColumnIndex("cacheid")); + cache.guid = (String) cursor.getString(cursor.getColumnIndex("guid")); + cache.type = (String) cursor.getString(cursor.getColumnIndex("type")); + cache.name = (String) cursor.getString(cursor.getColumnIndex("name")); + cache.own = cursor.getInt(cursor.getColumnIndex("own")) == 1; + cache.owner = (String) cursor.getString(cursor.getColumnIndex("owner")); + cache.ownerReal = (String) cursor.getString(cursor.getColumnIndex("owner_real")); + cache.hidden = new Date((long) cursor.getLong(cursor.getColumnIndex("hidden"))); + cache.hint = (String) cursor.getString(cursor.getColumnIndex("hint")); + cache.size = (String) cursor.getString(cursor.getColumnIndex("size")); + cache.difficulty = (Float) cursor.getFloat(cursor.getColumnIndex("difficulty")); + index = cursor.getColumnIndex("direction"); + if (cursor.isNull(index)) { + cache.direction = null; + } else { + cache.direction = (Double) cursor.getDouble(index); + } + index = cursor.getColumnIndex("distance"); + if (cursor.isNull(index)) { + cache.distance = null; + } else { + cache.distance = (Double) cursor.getDouble(index); + } + cache.terrain = (Float) cursor.getFloat(cursor.getColumnIndex("terrain")); + cache.latlon = (String) cursor.getString(cursor.getColumnIndex("latlon")); + cache.latitudeString = (String) cursor.getString(cursor.getColumnIndex("latitude_string")); + cache.longitudeString = (String) cursor.getString(cursor.getColumnIndex("longitude_string")); + cache.location = (String) cursor.getString(cursor.getColumnIndex("location")); + final int indexLat = cursor.getColumnIndex("latitude"); + final int indexLon = cursor.getColumnIndex("longitude"); + if (cursor.isNull(indexLat) || cursor.isNull(indexLon)) { + cache.coords = null; + } else { + cache.coords = new Geopoint(cursor.getDouble(indexLat), cursor.getDouble(indexLon)); + } + index = cursor.getColumnIndex("elevation"); + if (cursor.isNull(index)) { + cache.elevation = null; + } else { + cache.elevation = (Double) cursor.getDouble(index); + } + cache.personalNote = (String) cursor.getString(cursor.getColumnIndex("personal_note")); + cache.shortdesc = (String) cursor.getString(cursor.getColumnIndex("shortdesc")); + cache.description = (String) cursor.getString(cursor.getColumnIndex("description")); + cache.favouriteCnt = (Integer) cursor.getInt(cursor.getColumnIndex("favourite_cnt")); + cache.rating = (Float) cursor.getFloat(cursor.getColumnIndex("rating")); + cache.votes = (Integer) cursor.getInt(cursor.getColumnIndex("votes")); + cache.myVote = (Float) cursor.getFloat(cursor.getColumnIndex("myvote")); + cache.disabled = cursor.getLong(cursor.getColumnIndex("disabled")) == 1l; + cache.archived = cursor.getLong(cursor.getColumnIndex("archived")) == 1l; + cache.members = cursor.getLong(cursor.getColumnIndex("members")) == 1l; + cache.found = cursor.getLong(cursor.getColumnIndex("found")) == 1l; + cache.favourite = cursor.getLong(cursor.getColumnIndex("favourite")) == 1l; + cache.inventoryItems = (Integer) cursor.getInt(cursor.getColumnIndex("inventoryunknown")); + cache.onWatchlist = cursor.getLong(cursor.getColumnIndex("onWatchlist")) == 1l; + cache.reliableLatLon = cursor.getInt(cursor.getColumnIndex("reliable_latlon"))>0; + return cache; + } + public List<String> loadAttributes(String geocode) { if (StringUtils.isBlank(geocode)) { return null; @@ -2231,31 +2267,40 @@ public class cgData { List<cgLog> logs = new ArrayList<cgLog>(); - Cursor cursor = databaseRO.query( - dbTableLogs, - new String[]{"_id", "type", "author", "log", "date", "found"}, - "geocode = \"" + geocode + "\"", - null, - null, - null, - "date desc, _id asc", - "100"); + Cursor cursor = databaseRO.rawQuery( + "SELECT cg_logs._id as cg_logs_id, type, author, log, date, found, " + dbTableLogImages + "._id as cg_logImages_id, log_id, title, url FROM " + + dbTableLogs + " LEFT OUTER JOIN " + dbTableLogImages + + " ON ( cg_logs._id = log_id ) WHERE geocode = ? ORDER BY date desc, cg_logs._id asc", new String[]{ geocode}); if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - do { - cgLog log = new cgLog(); - log.id = (int) cursor.getInt(cursor.getColumnIndex("_id")); - log.type = (int) cursor.getInt(cursor.getColumnIndex("type")); - log.author = (String) cursor.getString(cursor.getColumnIndex("author")); - log.log = (String) cursor.getString(cursor.getColumnIndex("log")); - log.date = (long) cursor.getLong(cursor.getColumnIndex("date")); - log.found = (int) cursor.getInt(cursor.getColumnIndex("found")); - log.logImages = loadLogImages(log.id); - - logs.add(log); - } while (cursor.moveToNext()); + cgLog log = null; + while (cursor.moveToNext() && logs.size() < 100) { + if (log == null || log.id != cursor.getInt(cursor.getColumnIndex("cg_logs_id"))) { + log = new cgLog(); + log.id = (int) cursor.getInt(cursor.getColumnIndex("cg_logs_id")); + log.type = (int) cursor.getInt(cursor.getColumnIndex("type")); + log.author = (String) cursor.getString(cursor.getColumnIndex("author")); + log.log = (String) cursor.getString(cursor.getColumnIndex("log")); + log.date = (long) cursor.getLong(cursor.getColumnIndex("date")); + log.found = (int) cursor.getInt(cursor.getColumnIndex("found")); + logs.add(log); + } + if (!cursor.isNull(cursor.getColumnIndex("cg_logImages_id"))) { + final cgImage log_img = new cgImage(); + log_img.title = (String) cursor.getString(cursor.getColumnIndex("title")); + if (log_img.title == null) { + log_img.title = ""; + } + log_img.url = (String) cursor.getString(cursor.getColumnIndex("url")); + if (log_img.url == null) { + log_img.url = ""; + } + if (log.logImages == null) { + log.logImages = new ArrayList<cgImage>(); + } + log.logImages.add(log_img); + } + } } if (cursor != null) { @@ -2302,39 +2347,6 @@ public class cgData { return logCounts; } - public List<cgImage> loadLogImages(int log_id) { - init(); - - List<cgImage> logImgList = new ArrayList<cgImage>(); - - Cursor cursor = databaseRO.query( - dbTableLogImages, - new String[]{"_id", "log_id", "title", "url"}, - "log_id = \"" + log_id + "\"", - null, - null, - null, - null, - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - do { - final cgImage log_img = new cgImage(); - log_img.title = (String)cursor.getString(cursor.getColumnIndex("title")); - log_img.url = (String)cursor.getString(cursor.getColumnIndex("url")); - logImgList.add(log_img); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return logImgList; - } - public List<cgTrackable> loadInventory(String geocode) { if (StringUtils.isBlank(geocode)) { return null; |
