Получение следующего значения AUTO_INCREMENT базы данных SQLite - PullRequest
10 голосов
/ 05 августа 2011

Используя типичный объект SQLiteDatabase в API Android, что я могу сделать, чтобы получить следующее значение AUTO_INCREMENT определенного столбца (т. Е. id), не влияя на само значение. Есть ли способ для этого? Или какой запрос я должен выполнить, чтобы получить этот результат. Имейте в виду, что SQLiteDatabase.query () возвращает объект Cursor, поэтому я не слишком уверен, как обращаться с этим напрямую, если я просто хочу получить из него значение.

Ответы [ 7 ]

13 голосов
/ 05 августа 2011

Ты прав. Первый ответ (все еще ниже) работает только без AUTOINCREMENT для идентификатора. С AUTOINCREMENT значения сохраняются в отдельной таблице и используются для приращения. Вот пример поиска значения:

public void printAutoIncrements(){
    String query = "SELECT * FROM SQLITE_SEQUENCE";
    Cursor cursor = mDb.rawQuery(query, null);
    if (cursor.moveToFirst()){
        do{
            System.out.println("tableName: " +cursor.getString(cursor.getColumnIndex("name")));
            System.out.println("autoInc: " + cursor.getString(cursor.getColumnIndex("seq")));

        }while (cursor.moveToNext());
    }

    cursor.close(); 

}

См .: http://www.sqlite.org/autoinc.html

Первый ответ:

Вы можете запросить максимум столбца _id, например:

String query = "SELECT MAX(id) AS max_id FROM mytable";
Cursor cursor = db.rawQuery(query, null);

int id = 0;     
if (cursor.moveToFirst())
{
    do
    {           
        id = cursor.getInt(0);                  
    } while(cursor.moveToNext());           
}
return id;

Это работает для идентификаторов строк, которые не были указаны как «INTEGER PRIMARY KEY AUTOINCREMENT» (все таблицы имеют столбец идентификатора строки).

5 голосов
/ 22 октября 2015

Это лучший способ получить последний идентификатор при автоинкременте PRIMARY KEY с SQLITE

String query = "select seq from sqlite_sequence WHERE name = 'Table_Name'"

5 голосов
/ 29 января 2013

Важное замечание о таблице SQLITE_SEQUENCE.

Документация гласит:

Таблица SQLITE_SEQUENCE создается и инициализируется автоматически при создании обычной таблицы, содержащей столбец AUTOINCREMENT.

Таким образом, создается таблица SQLITE_SEQUENCE, но НЕ строка, связанная с таблицей, содержащей столбец AUTOINCREMENT.Эта строка создается с первым запросом на вставку (со значением «seq», равным 1).

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

2 голосов
/ 21 марта 2017

Вот что я использую, чтобы получить следующее AUTOINCREMENT значение для конкретной таблицы:

/**
 * Query sqlite_sequence table and search for the AUTOINCREMENT value for <code>tableName</code>
 * @param tableName The table name with which the AUTOINCREMENT value is associated.
 *
 * @return The next AUTOINCREMENT value for <code>tableName</code>
 * If an INSERT call was not previously executed on <code>tableName</code>, the value 1 will
 * be returned. Otherwise, the returned value will be the next AUTOINCREMENT.
 */
private long getNextAutoIncrement(String tableName) {
    /*
     * From the docs:
     * SQLite keeps track of the largest ROWID using an internal table named "sqlite_sequence".
     * The sqlite_sequence table is created and initialized automatically
     * whenever a normal table that contains an AUTOINCREMENT column is created.
     */
    String sqliteSequenceTableName = "sqlite_sequence";
    /*
     * Relevant columns to retrieve from <code>sqliteSequenceTableName</code>
     */
    String[] columns = {"seq"};
    String selection = "name=?";
    String[] selectionArgs = { tableName };

    Cursor cursor = mWritableDB.query(sqliteSequenceTableName, 
            columns, selection, selectionArgs, null, null, null);

    long autoIncrement = 0;

    if (cursor.moveToFirst()) {
        int indexSeq = cursor.getColumnIndex(columns[0]);
        autoIncrement = cursor.getLong(indexSeq);
    }

    cursor.close();

    return autoIncrement + 1;
}
1 голос
/ 15 июня 2017

Это работа.

public static long getNextId(SQLiteDatabase db, String tableName) {
    Cursor c = null;
    long seq = 0;
    try {
        String sql = "select seq from sqlite_sequence where name=?";
        c = db.rawQuery(sql, new String[] {tableName});
        if (c.moveToFirst()) {
            seq = c.getLong(0);
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }
    return seq + 1;
}
1 голос
/ 19 сентября 2013

Внутри используемого SQLiteOpenHelper запустите транзакцию.Вставьте некоторые данные и затем выполните откат.

Таким образом, вы сможете получить следующий идентификатор строки, например:

public long nextId() {
    long rowId = -1;

    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();
    try {
        ContentValues values = new ContentValues();
        // fill values ...

        // insert a valid row into your table
        rowId = db.insert(TABLE_NAME, null, values);

        // NOTE: we don't call  db.setTransactionSuccessful()
        // so as to rollback and cancel the last changes
    } finally {
        db.endTransaction();
    }
    return rowId;
}
0 голосов
/ 01 июня 2016

Вы можете использовать cursor.getInt(i); метод
i вот индекс столбца id

Cursor c = db.rawQuery("Select * From mSignUp", null);
            String mail = null;
            try {
                while (c.moveToNext()) {
                    mail = c.getString(0);
                    String pas = c.getString(1);
                    Toast.makeText(getApplicationContext(), "Name = " + mail + " Pass = " + pas, Toast.LENGTH_SHORT).show();
                }
            }catch (CursorIndexOutOfBoundsException e){
                Log.e("OutOfBound", Log.getStackTraceString(e));
            }
            finally {
                c.close();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...