2013-04-01 3 views
1

Мне нужно увеличить число целых чисел в таблице. Вместо того, чтобы делать выборочное и последовательное обновление, я хочу сделать это по одному запросу. Но не повезло.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)); 

    } 
} 

ответ

0

Согласно следующим источникам:

https://github.com/pivotal/robolectric/blob/master/src/main/java/org/robolectric/shadows/ShadowSQLiteStatement.java

executeUpdateDelete() не реализован.

С callThroughByDefault = false этот метод затенен по умолчанию пустая реализация. Вот почему я не получаю RuntimeException("Stub!").

Это должно быть очень легко теневым этот метод, но я нашел more general problemUri.parse метод) в robolectric 2.0-alpha-2

Update 1.

запросов оттягивается и теневые executeUpdateDelete():
https://github.com/pivotal/robolectric/pull/450
https://github.com/pivotal/robolectric/pull/451