[java] 삽입 후 생성 된 아이디 얻기

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

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



답변

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

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

여기서 db는 SQLiteDatabase입니다.


답변

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);
}


답변

나는 소스를 확인했다.
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열입니다.


답변

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

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


답변

을 사용하여 마지막으로 삽입 된 행 _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;

}


답변