삽입 후 생성 된 아이디 얻기


138

Android에서 SQLite를 사용하고 있으며 삽입 된 행의 생성 된 ID를 얻는 가장 좋은 방법을 알고 싶습니다.

내가 생각한 솔루션은 포함 후 검색하지만 가장 좋은 방법은 아닙니다.

답변:


271

insert메소드는 id방금 삽입 된 행 또는 -1삽입 중 오류가있는 경우 of of row를 리턴합니다 .

long id = db.insert(...);

여기서 db는 SQLiteDatabase입니다.


21
나는 사양을 읽었다. "반환 : 새로 삽입 된 행의 행 ID 또는 오류가 발생한 경우 -1"rowId는 생성 된 필드 "id primary key autoincrement"와 동일합니까?
Marcos Vasconcelos

29
예, 동일합니다.
GrAnd

3
@GrAnd,하지만 내 테이블에서 "시작 중간"행을 삭제하면 생성 된 id = n으로 n 번째 행 시퀀스를 끊습니다. 반환 된 행 ID가 생성 된 자동 증가 ID와 동일하게 유지됩니까?
UnknownJoe

1
INSERT OR UPDATE를 수행하고 ID를 얻으려면 어떻게해야합니까?
Timo

1
@UnknownJoe 나는 이것이 오래된 게시물이라는 것을 알고있다. 그러나 누군가에게 도움이 될 수 있습니다. 행 ID와 자동 증분 ID는 중간에서 삭제하더라도 동일합니다.
Raj Kannan Iyyappan

8

ContentValues를 사용하는 경우 :

 DBHelper db =new DBHelper();// your dbHelper
 ContentValues values = new ContentValues();
  values.put("firstName","Ahmad");
 values.put("lastName","Aghazadeh");
 long insertedId= db.getSQLiteDatabase().insert("user", "", values) ;

쿼리 실행자가 사용하는 경우 select last_insert_rowid()

String sql = "INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";
 DBHelper itemType =new DBHelper();// your dbHelper
 c = db.rawQuery(sql, null);
 if (c.moveToFirst())
    result = c.getLong(0);

방을 사용하는 경우

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}


@Dao
public interface UserDao{
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(User user);

    // Insert multiple users
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long[] insert(User... user);
}

5

나는 소스를 확인했다. insert메소드 사용 sqlite3_last_insert_rowid함수는 id를 반환합니다. 설명서에 따르면 https://www.sqlite.org/c3ref/last_insert_rowid.html 행 ID는 숨겨진 열이거나 INTEGER PRIMARY KEY선언 된 경우 유형의 열입니다 .

(를 제외하고 대부분의 SQLite는 테이블의 각 항목 WITHOUT ROWID표)는이 독특한 부호있는 정수 64 비트 은 "이라고 ROWID를 ". rowid는 명시 적으로 선언 된 열에서도 사용되지 않는 한 ROWID, OID 또는 _ROWID_라는 선언되지 않은 열로 항상 사용할 수 있습니다. 테이블에 유형의 열이있는 경우INTEGER PRIMARY KEY 해당 열은 rowid의 다른 별명입니다 .

이것이 기본 _ID열입니다.


1

mySQL 에서이 문제에 대해 약간의 문제가 있었지만 LAST_INSERT_ID는 ID를 얻는 신뢰할 수있는 방법이 아닙니다. 데이터베이스를 망치는 사용자가있는 경우 반환 된 ID는 실행 한 쿼리에 의해 삽입 된 ID가 아닐 수 있습니다. 다른 사용자는이 ID의 반환에 영향을 줄 수 있습니다. 우리는 1 분에 평균 7000 명의 사용자를 가진 서버를 가지고 있었고 항상 우연히 발견되었습니다.

우리가 해결 한 솔루션은 삽입 한 쿼리의 데이터를 사용한 다음 해당 데이터를 사용하여 해당 결과를 검색하는 것입니다. 어쨌든 마지막 ID를 찾는 요청을하고 있습니다. 따라서 id를 얻기 위해 field = var 및 field = var 인 SELECT id FROM 테이블을 수행 할 수도 있습니다. 쿼리에서 약간의 성능 저하가 있었지만 훨씬 더 안정적인 결과가 반환되었습니다.


3
이를 위해서는 각 행의 열 값이 고유하거나 대부분 고유해야하거나 여러 ID를 반환 할 위험이 있습니다.
Richard Barker

0

을 사용하여 마지막으로 삽입 된 행 _id를 얻을 수 있습니다 last_insert_rowid(). 샘플 코드는 다음과 같습니다.

/**
 * Return Last inserted row id(auto incremented row) (_id)
 * @return
 */
public int getLastAddedRowId() {
    String queryLastRowInserted = "select last_insert_rowid()";

    final Cursor cursor = database.rawQuery(queryLastRowInserted, null);
    int _idLastInsertedRow = 0;
    if (cursor != null) {
        try {
            if (cursor.moveToFirst()) {
                _idLastInsertedRow = cursor.getInt(0);
            }
        } finally {
            cursor.close();
        }
    }

    return _idLastInsertedRow;

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.