diff options
Diffstat (limited to 'main/src/cgeo/geocaching/cgData.java')
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 98 |
1 files changed, 45 insertions, 53 deletions
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 4831524..53ac334 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.res.Resources; import android.database.Cursor; +import android.database.DatabaseUtils; import android.database.DatabaseUtils.InsertHelper; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; @@ -1003,8 +1004,8 @@ public class cgData { values.put("type", cache.getType().id); values.put("name", cache.getName()); values.put("own", cache.isOwn() ? 1 : 0); - values.put("owner", cache.getOwner()); - values.put("owner_real", cache.getOwnerReal()); + values.put("owner", cache.getOwnerDisplayName()); + values.put("owner_real", cache.getOwnerUserId()); if (cache.getHiddenDate() == null) { values.put("hidden", 0); } else { @@ -1467,22 +1468,28 @@ public class cgData { init(); - final Cursor cursor = database.query( - dbTableCaches, - CACHE_COLUMNS, - cgData.whereGeocodeIn(geocodes), - null, - null, - null, - null, - null); + final StringBuilder query = new StringBuilder("SELECT "); + for (int i = 0; i < CACHE_COLUMNS.length; i++) { + query.append(i > 0 ? ", " : "").append(dbTableCaches).append('.').append(CACHE_COLUMNS[i]).append(' '); + } + query.append(',').append(dbTableLogsOffline).append(".log"); + query.append(" FROM ").append(dbTableCaches); + if (loadFlags.contains(LoadFlag.LOAD_OFFLINE_LOG)) { + query.append(" LEFT OUTER JOIN ").append(dbTableLogsOffline).append(" ON ( ").append(dbTableCaches).append(".geocode == ").append(dbTableLogsOffline).append(".geocode) "); + } + + query.append(" WHERE ").append(dbTableCaches).append('.'); + query.append(cgData.whereGeocodeIn(geocodes)); + + Cursor cursor = database.rawQuery(query.toString(), null); try { if (!cursor.moveToFirst()) { return Collections.emptySet(); } final Set<cgCache> caches = new HashSet<cgCache>(); + int logIndex = -1; do { //Extracted Method = LOADDBMINIMAL cgCache cache = cgData.createCacheFromDatabaseContent(cursor); @@ -1532,7 +1539,10 @@ public class cgData { } if (loadFlags.contains(LoadFlag.LOAD_OFFLINE_LOG)) { - cache.setLogOffline(hasLogOffline(cache.getGeocode())); + if (logIndex < 0) { + logIndex = cursor.getColumnIndex("log"); + } + cache.setLogOffline(!cursor.isNull(logIndex)); } cache.addStorageLocation(StorageLocation.DATABASE); cacheCache.putCacheInCache(cache); @@ -1545,6 +1555,7 @@ public class cgData { } } + /** * Builds a where for a viewport with the size enhanced by 50%. * @@ -1624,8 +1635,8 @@ public class cgData { cache.setType(CacheType.getById(cursor.getString(cacheColumnIndex[8]))); cache.setName(cursor.getString(cacheColumnIndex[9])); cache.setOwn(cursor.getInt(cacheColumnIndex[10]) == 1); - cache.setOwner(cursor.getString(cacheColumnIndex[11])); - cache.setOwnerReal(cursor.getString(cacheColumnIndex[12])); + cache.setOwnerDisplayName(cursor.getString(cacheColumnIndex[11])); + cache.setOwnerUserId(cursor.getString(cacheColumnIndex[12])); long dateValue = cursor.getLong(cacheColumnIndex[13]); if (dateValue != 0) { cache.setHidden(new Date(dateValue)); @@ -2116,13 +2127,13 @@ public class cgData { if (cacheType == CacheType.ALL) { sql = "select count(_id) from " + dbTableCaches + listSql; } else { - sql = "select count(_id) from " + dbTableCaches + " where type = \"" + cacheType.id + "\"" + listSqlW; + sql = "select count(_id) from " + dbTableCaches + " where type = " + DatabaseUtils.sqlEscapeString(cacheType.id) + listSqlW; } } else { if (cacheType == CacheType.ALL) { sql = "select count(_id) from " + dbTableCaches + " where detailed = 1" + listSqlW; } else { - sql = "select count(_id) from " + dbTableCaches + " where detailed = 1 and type = \"" + cacheType.id + "\"" + listSqlW; + sql = "select count(_id) from " + dbTableCaches + " where detailed = 1 and type = " + DatabaseUtils.sqlEscapeString(cacheType.id) + listSqlW; } } SQLiteStatement compiledStmnt = database.compileStatement(sql); @@ -2179,9 +2190,8 @@ public class cgData { } if (cacheType != CacheType.ALL) { - specifySql.append(" and type = \""); - specifySql.append(cacheType.id); - specifySql.append('"'); + specifySql.append(" and type = "); + specifySql.append(DatabaseUtils.sqlEscapeString(cacheType.id)); } try { @@ -2237,9 +2247,8 @@ public class cgData { specifySql.append(" and detailed = 1"); } if (cacheType != CacheType.ALL) { - specifySql.append(" and type = \""); - specifySql.append(cacheType.id); - specifySql.append('"'); + specifySql.append(" and type = "); + specifySql.append(DatabaseUtils.sqlEscapeString(cacheType.id)); } try { @@ -2312,9 +2321,8 @@ public class cgData { // cacheType limitation if (cacheType != CacheType.ALL) { - where.append(" and type = \""); - where.append(cacheType.id); - where.append('"'); + where.append(" and type = "); + where.append(DatabaseUtils.sqlEscapeString(cacheType.id)); } // offline caches only @@ -2458,7 +2466,7 @@ public class cgData { // Drop caches from the database final ArrayList<String> quotedGeocodes = new ArrayList<String>(geocodes.size()); for (final String geocode : geocodes) { - quotedGeocodes.add('"' + geocode + '"'); + quotedGeocodes.add(DatabaseUtils.sqlEscapeString(geocode)); } final String geocodeList = StringUtils.join(quotedGeocodes.toArray(), ','); final String baseWhereClause = "geocode in (" + geocodeList + ")"; @@ -2470,7 +2478,7 @@ public class cgData { database.delete(dbTableLogs, baseWhereClause, null); database.delete(dbTableLogCount, baseWhereClause, null); database.delete(dbTableLogsOffline, baseWhereClause, null); - database.delete(dbTableWaypoints, baseWhereClause + " and type <> \"own\"", null); + database.delete(dbTableWaypoints, baseWhereClause + " and type <> 'own'", null); database.delete(dbTableTrackables, baseWhereClause, null); database.setTransactionSuccessful(); } finally { @@ -2486,41 +2494,29 @@ public class cgData { public boolean saveLogOffline(String geocode, Date date, LogType type, String log) { if (StringUtils.isBlank(geocode)) { + Log.e("cgData.saveLogOffline: cannot log a blank geocode"); return false; } if (LogType.UNKNOWN == type && StringUtils.isBlank(log)) { + Log.e("cgData.saveLogOffline: cannot log an unknown log type and no message"); return false; } init(); - boolean status = false; - ContentValues values = new ContentValues(); + final ContentValues values = new ContentValues(); values.put("geocode", geocode); values.put("updated", System.currentTimeMillis()); values.put("type", type.id); values.put("log", log); values.put("date", date.getTime()); - try { - if (hasLogOffline(geocode)) { - final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode }); - - if (rows > 0) { - status = true; - } - } else { - final long id = database.insert(dbTableLogsOffline, null, values); - - if (id > 0) { - status = true; - } - } - } catch (Exception e) { - Log.e("cgData.saveLogOffline: " + e.toString()); + if (hasLogOffline(geocode)) { + final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode }); + return rows > 0; } - - return status; + final long id = database.insert(dbTableLogsOffline, null, values); + return id != -1; } public LogEntry loadLogOffline(String geocode) { @@ -2917,14 +2913,10 @@ public class cgData { if (all.length() > 0) { all.append(", "); } - all.append('"'); - all.append(geocode); - all.append('"'); + all.append(DatabaseUtils.sqlEscapeString(geocode)); } - where.append("geocode in ("); - where.append(all); - where.append(')'); + where.append("geocode in (").append(all).append(')'); } return where.toString(); |
