Q: Как обновить 1 столбец с одинаковыми данными для разных идентификаторов (Android) - PullRequest
0 голосов
/ 25 июня 2018

Здесь у меня есть массив идентификаторов, и метод обновления работает, только если его 1 идентификатор в массиве, но если я поставлю 2-3, это выдаст мне ошибку .. что-то вроде: Too many bind arguments. 4 arguments were provided but the statement needs 2 arguments Как я могу заставить его работать,Я хочу установить одно и то же значение в одном и том же столбце для разных идентификаторов.

    ContentValues values = new ContentValues();
    values.put(DataEntry.COLUMN_DATA, "1");
    String selection = DataEntry._ID + "=?";
    String[] selectionArgs = selectedData.toArray(new String[selectedData.size()]);
    // To be a bit more clear the above line looks like this:
    // String[] selectionArgs = { 1, 2, 3, 4, 5 }; String array of IDs which varies 

    int rowsAffected = getContentResolver().update(DataEntry.CONTENT_URI, values, selection, selectionArgs);

Метод обновления следующий:

    SQLiteDatabase db = mDbHelper.getWritableDatabase();
    int rowsUpdated = db.update(DataEntry.TABLE_NAME, values, selection, selectionArgs);

1 Ответ

0 голосов
/ 25 июня 2018

Я полагаю, что вы могли бы использовать: -

ContentValues values = new ContentValues();
values.put(DataEntry.COLUMN_DATA, "1");
String selection = DataEntry._ID + "=?";
String[] selectionArgs = selectedData.toArray(new String[selectedData.size()]);
for each(String s: selectionArgs) {
    int rowsAffected = getContentResolver().update(DataEntry.CONTENT_URI, values, selection, new String[]{s});
}

В качестве альтернативы вы можете использовать WHERE IN (list of id's), что может быть таким: -

ContentValues values = new ContentValues();
values.put(DataEntry.COLUMN_DATA, "1");
String selection " IN (?)";
String[] selectionArgs = selectedData.toArray(new String[selectedData.size()]);
StringBuilder sb = new StringBuilder();
for (int i=0; i < selectionArgs.length(); i++) {
    sb.append(selectionArgs[i]);
    if (i < (selectionArgs.length - 1)) {
        sb.append(",");
    }
}        
int rowsAffected = getContentResolver().update(DataEntry.CONTENT_URI, values, selection, new String[]{sb.toString()});

Конечно, вы можете зацикливатьсяпутем применения х заполнителей.Это будет выглядеть следующим образом: -

ContentValues values = new ContentValues();
values.put(DataEntry.COLUMN_DATA, "1");
String[] selectionArgs = selectedData.toArray(new String[selectedData.size()]);
StringBuilder sb = new StringBuilder("IN (");
for (int i=0; i < selectionArgs.length(); i++) {
    if (i < (selectionArgs.length() - 1) {
        sb.append("?,");
    } else {
        sb.append("?)");
    }
}        
int rowsAffected = getContentResolver().update(DataEntry.CONTENT_URI, values, sb.toString, selectionArgs);
  • Обратите внимание, что это принципиальный код, который не был проверен, поэтому он может содержать некоторые ошибки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...