/** * Create a SQL UPDATE string. Returned values are then bound via * JDBC to facilitate various data types. * * @param table table name * @param values column name/value pairs * @param whereClause SQL where clause fragment * @param whereArgs Array of substitutions for args in whereClause * @return update string */ public static SQLStringAndBindings buildUpdateString(String table, ContentValues values, String whereClause, String[] whereArgs) { StringBuilder sb = new StringBuilder(); sb.append("UPDATE "); sb.append(table); sb.append(" SET "); SQLStringAndBindings columnAssignmentsClause = buildColumnAssignmentsClause(values); sb.append(columnAssignmentsClause.sql); if (whereClause != null) { String where = whereClause; if (whereArgs != null) { where = buildWhereClause(whereClause, whereArgs); } sb.append(" WHERE "); sb.append(where); } sb.append(";"); return new SQLStringAndBindings(sb.toString(), columnAssignmentsClause.columnValues); }
/** * Create a SQL INSERT string. Returned values are then bound via * JDBC to facilitate various data types. * * @param table table name * @param values column name/value pairs * @param conflictAlgorithm the conflict algorithm to use * @return insert string */ public static SQLStringAndBindings buildInsertString(String table, ContentValues values, int conflictAlgorithm) throws SQLException { StringBuilder sb = new StringBuilder(); sb.append("INSERT "); sb.append(CONFLICT_VALUES[conflictAlgorithm]); sb.append("INTO "); sb.append(table); sb.append(" "); SQLStringAndBindings columnsValueClause = buildColumnValuesClause(values); sb.append(columnsValueClause.sql); sb.append(";"); String sql = DatabaseConfig.getScrubSQL(sb.toString()); return new SQLStringAndBindings(sql, columnsValueClause.columnValues); }
@Implementation public int delete(String table, String whereClause, String[] whereArgs) { String sql = buildDeleteString(table, whereClause, whereArgs); try { return connection.prepareStatement(sql).executeUpdate(); } catch (SQLException e) { throw new RuntimeException("SQL exception in delete", e); } }
/** * Create a SQL DELETE string. * * @param table table name * @param whereClause SQL where clause fragment * @param whereArgs Array of substitutions for args in whereClause * @return delete string */ public static String buildDeleteString(String table, String whereClause, String[] whereArgs) { StringBuilder sb = new StringBuilder(); sb.append("DELETE FROM "); sb.append(table); if (whereClause != null) { String where = whereClause; if (whereArgs != null) { where = buildWhereClause(whereClause, whereArgs); } sb.append(" WHERE "); sb.append(where); } sb.append(";"); return sb.toString(); }
@Implementation public int update(String table, ContentValues values, String whereClause, String[] whereArgs) { SQLStringAndBindings sqlUpdateString = buildUpdateString(table, values, whereClause, whereArgs); try { PreparedStatement statement = connection.prepareStatement(sqlUpdateString.sql); Iterator<Object> columns = sqlUpdateString.columnValues.iterator(); int i = 1; while (columns.hasNext()) { statement.setObject(i++, columns.next()); } return statement.executeUpdate(); } catch (SQLException e) { throw new RuntimeException("SQL exception in update", e); } }
@Implementation public long insertWithOnConflict(String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm) throws android.database.SQLException{ try { SQLStringAndBindings sqlInsertString = buildInsertString(table, initialValues, conflictAlgorithm); PreparedStatement insert = connection.prepareStatement(sqlInsertString.sql, Statement.RETURN_GENERATED_KEYS); Iterator<Object> columns = sqlInsertString.columnValues.iterator(); int i = 1; long result = -1; while (columns.hasNext()) { insert.setObject(i++, columns.next()); } insert.executeUpdate(); ResultSet resultSet = insert.getGeneratedKeys(); if (resultSet.next()) { result = resultSet.getLong(1); } resultSet.close(); return result; } catch (SQLException e) { throw new android.database.SQLException(e.getLocalizedMessage()); } }
@Implementation public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) { String where = selection; if (selection != null && selectionArgs != null) { where = buildWhereClause(selection, selectionArgs); } String sql = SQLiteQueryBuilder.buildQueryString(distinct, table, columns, where, groupBy, having, orderBy, limit); ResultSet resultSet; try { Statement statement = connection.createStatement(DatabaseConfig.getResultSetType(), ResultSet.CONCUR_READ_ONLY); resultSet = statement.executeQuery(sql); } catch (SQLException e) { throw new RuntimeException("SQL exception in query", e); } SQLiteCursor cursor = new SQLiteCursor(null, null, null, null); shadowOf(cursor).setResultSet(resultSet,sql); return cursor; }
@Implementation public Cursor rawQueryWithFactory (SQLiteDatabase.CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable) { String sqlBody = sql; if (sql != null) { sqlBody = buildWhereClause(sql, selectionArgs); } ResultSet resultSet; try { SQLiteStatement stmt = compileStatement(sql); int numArgs = selectionArgs == null ? 0 : selectionArgs.length; for (int i = 0; i < numArgs; i++) { stmt.bindString(i + 1, selectionArgs[i]); } resultSet = Robolectric.shadowOf(stmt).getStatement().executeQuery(); } catch (SQLException e) { throw new RuntimeException("SQL exception in query", e); } //TODO: assert rawquery with args returns actual values SQLiteCursor cursor = (SQLiteCursor) cursorFactory.newCursor(null, null, null, null); shadowOf(cursor).setResultSet(resultSet, sqlBody); return cursor; }