Каков наилучший способ получить последний вставленный идентификатор с помощью sqlite из Java?

Как правило, вы хотели бы преобразовать этот массив обратно в int в более поздней точке, вот методы для преобразования массива int в массив байтов и наоборот:

public static byte[] convertToByteArray(final int[] pIntArray)
{
    final byte[] array = new byte[pIntArray.length * 4];
    for (int j = 0; j < pIntArray.length; j++)
    {
        final int c = pIntArray[j];
        array[j * 4] = (byte)((c & 0xFF000000) >> 24);
        array[j * 4 + 1] = (byte)((c & 0xFF0000) >> 16);
        array[j * 4 + 2] = (byte)((c & 0xFF00) >> 8);
        array[j * 4 + 3] = (byte)(c & 0xFF);
    }
    return array;
}

public static int[] convertToIntArray(final byte[] pByteArray)
{
    final int[] array = new int[pByteArray.length / 4];
    for (int i = 0; i < array.length; i++)
        array[i] = (((int)(pByteArray[i * 4]) << 24) & 0xFF000000) |
                (((int)(pByteArray[i * 4 + 1]) << 16) & 0xFF0000) |
                (((int)(pByteArray[i * 4 + 2]) << 8) & 0xFF00) |
                ((int)(pByteArray[i * 4 + 3]) & 0xFF);
    return array;
}

Обратите внимание, что из-за распространения знака и т. Д. При преобразовании обратно в int

необходимы «& amp; 0xFF ...»,
13
задан Brian 8 May 2009 в 05:41
поделиться

2 ответа

Используйте getGeneratedKeys(), если Ваш драйвер JDBC поддерживает его. Вы не хотите небрежно обращаться с попыткой получить ключ сами после вставки. Если бы Ваш драйвер не поддерживает getGeneratedKeys() затем, я получил бы следующее значение от ключа перед вставкой.

9
ответ дан frogatto 8 May 2009 в 05:41
поделиться

Любой подход выполняет тот же точный SQL-оператор, но java.sql.Statement.getGeneratedKeys() является более портативным к различным базовым базам данных.

Использование любого sqlite3_last_insert_rowid() C API-функция или last_insert_rowid() Функция SQL является корректным способом получить rowid, сгенерированный во время последней вставки.

SQLite поддерживает синтаксис скалярной функции SQL как:

SELECT function-name();

Поэтому, если у Вас нет доступа к API C непосредственно, можно вызвать скалярную функцию last_insert_rowid() через a SELECT оператор.

Если Вы смотрите на исходный код для реализации SQLiteJDBC (это, что Вы используете?) Вы будете видеть, что это точно что, автора которого обертка JDBC сделала:

ResultSet getGeneratedKeys() throws SQLException {
    if (getGeneratedKeys == null) getGeneratedKeys = conn.prepareStatement(
        "select last_insert_rowid();");
    return getGeneratedKeys.executeQuery();
}
22
ответ дан 1 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: