package org.sana.android.db; import java.util.ArrayList; import java.util.List; import org.sana.android.content.Uris; import org.sana.android.provider.BaseContract; import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import android.text.TextUtils; /** * Collection of database helper methods. * * @author Sana Development * */ public final class DBUtils { private DBUtils(){} /** * Returns the selection statement as:<br/> * ( uuid = "uri.getLastPathSegment()" ) AND ( selection ) * * @param uri * @param whereClause * @return */ public static String getWhereClauseWithUUID(Uri uri, String whereClause){ String select = whereClause; select = concatenateWhere(whereClause, BaseContract.UUID + " = '" + uri.getLastPathSegment() +"'"); return select; } /** * Returns the selection statement as * ( _ID = "uri.getPathSegments().get(1)" ) AND ( selection ) * or as the original based on whether the uri match was a dir or item. * Relies on matcher values for *.dir being even integers. * @param uri * @param whereClause * @return */ public static String getWhereClauseWithID(Uri uri, String whereClause){ return concatenateWhere(whereClause, BaseContract._ID + " = " + uri.getLastPathSegment()); } /** * Returns the selection statement as * ( _ID = "uri.getPathSegments().get(1)" ) AND ( selection ) * or as the original based on whether the uri match was a dir or item. * Relies on matcher values for *.dir being even integers. * @param uri * @param whereClause * @return */ public static String getWhereClause(Uri uri, int match, String whereClause){ String select = whereClause; if(Uris.isItemType(uri)){ if((Uris.getTypeDescriptor(uri) & Uris.ITEM_ID) != 0) select = concatenateWhere(whereClause, BaseColumns._ID + " LIKE " + uri.getLastPathSegment()); else select = concatenateWhere(whereClause, BaseContract.UUID + " LIKE '" + uri.getLastPathSegment() +"'"); } return select; } /** * Constructs a SQL WHERE clause with {@link android.provider.BaseColumns#_ID _ID} * prepended. * * @param id The value of the _ID column * @param wherClause * @return */ public static String getWhereClause(long id, String wherClause){ return concatenateWhere(BaseColumns._ID + " LIKE " + id, wherClause); } /** * * @param cursor * @param column * @return */ public static List<String> dumpStringColumn(Cursor cursor, int column){ List<String> list = new ArrayList<String>(); while(cursor.moveToNext()){ list.add(cursor.getString(column)); } return list; } /** * Appends one set of selection args to another. This is useful when adding * a selection argument to a user provided set. * * @param originalValues * @param newValues * @return */ public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) { int l1 = (originalValues != null)? originalValues.length: 0; int l2 = (newValues != null)? newValues.length: 0; String[] result = new String[l1 + l2]; for(int index = 0;index < l1 + l2;index++){ result[index] = (index < l1)? originalValues[index]: newValues[index]; } return result; } /** * Concatenates two SQL WHERE clauses, handling empty or null values. * * @param arg1 * @param arg2 * @return */ public static String concatenateWhere(String arg1, String arg2){ String cat = ""; // Both non empty concatenate if(!TextUtils.isEmpty(arg1) && !TextUtils.isEmpty(arg2)) cat = String.format("%s AND %s", arg1, arg2); else { // at least one empty if(!TextUtils.isEmpty(arg1)) cat = arg1; else if(!TextUtils.isEmpty(arg2)) cat = arg2; } cat.replace("=", " LIKE "); return cat; } /** * Converts any Uri query string into a select statement by taking * every key value pair in the query into "key = 'value'". * * @param uri * @return */ public static String convertUriQueryToSelect(Uri uri){ String qString = uri.getQuery(); // Shortcut out for null query if(TextUtils.isEmpty(qString)) return null; StringBuilder select = new StringBuilder(); String[] rawQuery = uri.getQuery().split(","); for(int index = 0;index < rawQuery.length;index++){ String[] kv = rawQuery[index].split("="); // append space after first key value pair if(index > 0) select.append(" "); select.append(String.format("%s LIKE '%s'",kv[0],kv[1])); } return select.toString(); } }