package by.istin.android.xcore.db.impl.sqlite; import android.annotation.TargetApi; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Build; import by.istin.android.xcore.db.IDBConnection; import by.istin.android.xcore.utils.CursorUtils; /** * Created with IntelliJ IDEA. * User: IstiN * Date: 19.10.13 */ class SQLiteConnection implements IDBConnection { private final SQLiteDatabase mDatabase; SQLiteConnection(SQLiteDatabase database) { mDatabase = database; } @Override public void execSQL(String sql) { mDatabase.execSQL(sql); } @Override public Cursor query(String table, String[] projection, String selection, String[] selectionArgs, String groupBy, String having, String sortOrder, String limit) { return mDatabase.query(table, projection, selection, selectionArgs, groupBy, having, sortOrder, limit); } @Override public boolean isExists(String tableName) { boolean isExists = false; Cursor cursor = null; try { cursor = mDatabase.query("sqlite_master", new String[]{"name"}, "type=? AND name=?", new String[]{"table", tableName}, null, null, null); isExists = !CursorUtils.isEmpty(cursor); } finally { CursorUtils.close(cursor); } return isExists; } @Override public Cursor rawQuery(String sql, String[] selectionArgs) { return mDatabase.rawQuery(sql, selectionArgs); } @Override public long insert(String tableName, ContentValues contentValues) { return mDatabase.insert(tableName, null, contentValues); } //TODO maybe it improve insert in future /*private void insertWithStatement(IDBConnection db, Class<?> clazz, ContentValues contentValues, String tableName) { SQLiteStatement insertStatement = dbAssociationCache.getInsertStatement(clazz); if (insertStatement == null) { List<Field> fields = ReflectUtils.getEntityKeys(clazz); List<String> columns = new ArrayList<String>(); for (Field field : fields) { if (field.isAnnotationPresent(dbEntity.class)) { continue; } if (field.isAnnotationPresent(dbEntities.class)) { continue; } String name = ReflectUtils.getStaticStringValue(field); columns.add(name); } insertStatement = db.compileStatement(createInsert(tableName, columns.toArray(new String[columns.size()]))); dbAssociationCache.setInsertStatement(clazz, insertStatement); } insertStatement.clearBindings(); Set<String> keys = contentValues.keySet(); String[] values = new String[keys.size()]; int i = 0; for (String key : keys) { values[i] = contentValues.getAsString(key); i++; } insertStatement.bindAllArgsAsStrings(values); insertStatement.execute(); } static public String createInsert(final String tableName, final String[] columnNames) { if (tableName == null || columnNames == null || columnNames.length == 0) { throw new IllegalArgumentException(); } final StringBuilder s = new StringBuilder(); s.append("INSERT OR REPLACE INTO ").append(tableName).append(" ("); for (String column : columnNames) { s.append(column).append(" ,"); } int length = s.length(); s.delete(length - 2, length); s.append(") VALUES( "); for (int i = 0; i < columnNames.length; i++) { s.append(" ? ,"); } length = s.length(); s.delete(length - 2, length); s.append(")"); return s.toString(); }*/ @Override public int update(String tableName, ContentValues contentValues, String selection, String[] selectionArgs) { return mDatabase.update(tableName, contentValues, selection, selectionArgs); } @Override @TargetApi(value = Build.VERSION_CODES.HONEYCOMB) public void beginTransaction() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mDatabase.beginTransactionNonExclusive(); } else { mDatabase.beginTransaction(); } } @Override public void setTransactionSuccessful() { mDatabase.setTransactionSuccessful(); } @Override public void endTransaction() { mDatabase.endTransaction(); } @Override public int delete(String tableName, String where, String[] whereArgs) { return mDatabase.delete(tableName, where, whereArgs); } }