sourcecode

삽입 후 생성된 ID 가져오기

copyscript 2022. 9. 22. 00:11
반응형

삽입 후 생성된 ID 가져오기

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

찾고 싶은 솔루션이 포함되어 있습니다만, 최선은 아닌 것 같습니다.

메서드는id삽입된 행 또는-1삽입 중 오류가 발생한 경우.

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

쿼리 exec이 사용되는 경우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_rowidID를 반환하는 함수입니다.매뉴얼에 따르면 https://www.sqlite.org/c3ref/last_insert_rowid.html 행 ID는 숨겨진 열 또는 유형의 열입니다.INTEGER PRIMARY KEY선언되면요.

대부분의 SQLite 테이블의 각 엔트리(제외)WITHOUT ROWIDtables)에는 "rowid"라고 불리는 고유한 64비트 부호 정수 키가 있습니다.rowid는 명시적으로 선언된 열에서도 사용되지 않는 한 항상 ROWID, OID 또는 _ROWID_라는 이름의 선언되지 않은 열로 사용할 수 있습니다.테이블에 유형의 열이 있는 경우 해당 열은 rowid의 다른 별칭입니다.

이게 디폴트입니다._ID보통 컬럼

mySQL, LAST_INSERT_에서 많은 문제가 발생했습니다.ID는 신뢰할 수 있는 ID를 가져오는 방법이 아닙니다.데이터베이스를 망치하는 사용자가 있는 경우 반환된 ID가 실행한 쿼리에 의해 삽입된 ID가 아닐 수 있으며, 다른 여러 사용자가 이 ID의 반환에 영향을 미칠 수 있습니다.1분에 평균 7000명의 유저가 있는 서버는, 항상 실패해 버렸습니다.

우리의 해결책은 당신이 삽입한 쿼리의 데이터를 사용하여 그 데이터를 사용하여 결과를 검색하는 것이었습니다.어쨌든 당신은 마지막 아이디를 찾는 요청을 하고 있습니다.따라서 SELECT ID FROM 테이블(field=var 및 field=var)을 실행하여 ID를 가져옵니다.쿼리에 약간의 퍼포먼스가 있었지만 훨씬 더 신뢰할 수 있는 결과가 반환되었습니다.

마지막으로 삽입된 행 _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;

}

언급URL : https://stackoverflow.com/questions/5409751/get-generated-id-after-insert

반응형