Мне нужно увеличить число целых чисел в таблице. Вместо того, чтобы делать выборочное и последовательное обновление, я хочу сделать это по одному запросу. Но не повезло.Robolectric + SQLiteStatement.executeUpdateDelete() не выполняет никаких действий
После кода возвращает 0:
final SQLiteStatement stmt = helper.getWritableDatabase().
compileStatement("update my_table set my_count = my_count + 1 where _id = ?");
try
{
stmt.bindLong(1, id);
return stmt.executeUpdateDelete();
}
finally
{
stmt.close();
}
И, конечно же, запись не обновляется.
Но это возвращает 1:
final ContentValues v = new ContentValues();
v.put("my_count", 1);
return helper.getWritableDatabase().
update("my_table", v, "_id=?", new String[]{String.valueOf(id)});
Запись с указанным идентификатором является 100% существует. Пробовал сделать это как внутри транзакции, так и без нее - результат такой же. Не тестировалось на реальном SQLiteStatement, вероятно, Robolectric.
У кого-нибудь есть какие-либо предположения относительно этого эффекта? Или предложения о том, как обойти эту проблему (может быть, без использования SQLiteStatement
)?
Спасибо.
Update 1.
Я также катить некоторые простой тест:
@RunWith(RobolectricTestRunner.class)
public class SQLiteStatementTest
{
private static class TestOpenHelper extends SQLiteOpenHelper
{
public TestOpenHelper(Context context)
{
super(context, "test", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE test(_id INTEGER PRIMARY KEY AUTOINCREMENT, count INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
}
}
@Test
public void testExecuteUpdateDeleteModifiesRow() throws Exception
{
final int initialCount = 6;
final TestOpenHelper helper = new TestOpenHelper(Robolectric.application);
final ContentValues v = new ContentValues();
v.put("count", initialCount);
final long id = helper.getWritableDatabase().insert("test", null, v);
final SQLiteStatement stmt = helper.getWritableDatabase().
compileStatement("update test set count = count + 1 where _id=?");
stmt.bindLong(1, id);
assertThat(stmt.executeUpdateDelete(), is(1));
}
}