Room Persistence lib의 기본 키를 자동 증분으로 만드는 방법


196

foodId자동 증가 로 만들고 싶은 Entity (Room Persistence lib) 클래스 Food를 만들고 있습니다.

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}

foodId자동 증분 필드는 어떻게 설정 합니까?


4
대신에 double로 선언 0.toDouble()할 수 있습니다0.0
RobCo

2
Food 클래스의 새 인스턴스를 작성하는 방법 수동으로 ID를 지정하거나 비워 두시겠습니까?
Zookey

3
향후 독자를위한 참고 사항-Room이 설정되지 않은 것으로 취급하려면 기본 키가 0이어야합니다. 다른 기본값 (예 : -1)을 사용하면 Room에서 ID를 자동 생성하지 않습니다.
Martin Melka

답변:


375

당신은 autoGenerate속성 을 사용해야합니다

기본 키 주석은 다음과 같아야합니다.

@PrimaryKey(autoGenerate = true)

PrimaryKey 참조 .


3
고마워, 나는 autoIncrement를 찾고 있었기 때문에 찾을 수 없었습니다.
chandil03

안녕하세요 @MatPag 하나의 테이블에 두 개의 기본 키 (복합 기본 키)를 원하고 기본 키 중 하나를 자동 증분 해야하는 경우 어떻게해야합니까? 어떻게하면 되나요? 여기에 대답 할 수 있습니까 ?
Priyanka Alachiya

1
@MatPeg 하나의 PrimaryKey가 자체 생성되고 REST에서 온 것이면 어떻게 @Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))됩니까?
murt

@murt 복합 기본 키가 필요하지만 원하는 것을 수행 할 수 없습니다. 여기를
MatPag

링크 된 문서의 중요한 부분 :Insert methods treat 0 as not-set while inserting the item.
Micha

127

다음 @PrimaryKey(autoGenerate = true)과 같이 추가 할 수 있습니다 .

@Entity
data class Food(
        var foodName: String, 
        var foodDesc: String, 
        var protein: Double, 
        var carbs: Double, 
        var fat: Double
){
    @PrimaryKey(autoGenerate = true)
    var foodId: Int = 0 // or foodId: Int? = null
    var calories: Double = 0.toDouble()
}

35
foodIdnull 일 필요는 없습니다 (그러나 가능할 수도 있습니다). 예를 들어 기본값을 사용할 수도 있습니다. var foodId: Int = 0자동 생성이 제대로 작동합니다.
Michał Baran

8
java doc의 @ MichałBaran은 유형이 기본 Java int이거나 long, 0이 널 입력 가능으로 처리되고, 유형이 정수 또는 Long 인 경우 널 입력이 가능합니다. Null을 허용하지 않는 Kotlin Int가 JVM에서 프리미티브 int로 작동하면 옳고 var foodId: Int = 0작동하지만 var foodId: Int? = 0Int 이후로는 작동하지 않습니까? JVM에서 정수로 변환됩니다. @ JMK, 0으로 만들면 int위에서 언급 한 이유로 null 을 허용하지 않아야 합니다.
Allan Veloso

3
당신은 다른 방법으로하지 않고 쓸 수있다 : val jack = User(name = "Jack", phone= 1)이 경우 생성자에서 0을 제거 할 수 있습니다
user7856586

2
@AllanVeloso 왜 foodId생성자가 아닌 본문에 넣었 는지 설명 할 수 있습니까 ?
Neeraj Sewani

2
foodId는 삽입시 Room에 의해 자동 생성되므로 생성자에서 사용할 수 없을 가능성이 높습니다.
Allan Veloso

42

더하다 @PrimaryKey(autoGenerate = true)

@Entity
public class User {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "full_name")
    private String name;

    @ColumnInfo(name = "phone")
    private String phone;

    public User(){
    }

    //type-1
    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    //type-2
    public User(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

}

데이터를 저장하는 동안

 //type-1
 db.userDao().InsertAll(new User(sName,sPhone)); 

 //type-2
 db.userDao().InsertAll(new User(0,sName,sPhone)); 

타입 -1

기본 키의 값을 전달하지 않으면 기본적으로 0 또는 null이됩니다.

타입 -2

넣어 아이디에 대한 널 (null) 또는 제로 개체를 만드는 동안 (내 경우 사용자 개체)

필드 유형이 long 또는 int이거나 TypeConverter가 long 또는 int로 변환하는 경우 Insert 메서드는 항목을 삽입하는 동안 0을 설정되지 않은 것으로 간주합니다.

필드의 유형이 Integer 또는 Long (객체)이거나 TypeConverter가 필드를 Integer 또는 Long으로 변환하는 경우 Insert 메서드는 항목을 삽입하는 동안 null을 설정되지 않은 것으로 간주합니다.


1
autoGenerate로 설정되어 있어도 사용자 지정 ID를 Entity에 전달할 수 있습니까?
IgorGanapolsky

2
@Igor Ganapolsky 예,하지만 해당 맞춤 ID로 항목이 생성됩니다. [자동 증가가 작동하지 않습니다.] 동일한 ID를 다시 전달하면 'UNIQUE 제약 조건 실패'예외가 발생하므로 항상 새 ID를 전달하거나 [0 또는 null] 및 자동 증가가이 작업을 수행하도록합니다.
kunal khedkar

3
자동 생성하려는 경우 사용자가 생성자에 ID를 넣도록 허용하는 이유는 무엇입니까?
hellcast

Kotlin에서는 데이터 클래스를 사용하고 쓸 수 있습니다 val jack = User(name = "Jack", phone= 1).이 경우 생성자에서 0을 제거 할 수 있습니다.
user7856586

@hellcast DB를 쿼리 할 때 생성자에 id를 포함하지 않으면 (단지 어려운 방법으로) id 필드를 할당하지 않습니다 (생성자에서 초기화 한 것이 무엇이든). 객체의 필드를 채울 때 동일한 생성자를 호출한다고 가정합니다.
알리 히 라니

6
@Entity(tableName = "user")
data class User(

@PrimaryKey(autoGenerate = true)  var id: Int?,
       var name: String,
       var dob: String,
       var address: String,
       var gender: String
)
{
    constructor():this(null,
        "","","","")
}

4
이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자들에게 질문에 대한 답변을 제공하므로 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
Johan

4
"use @PrimaryKey(autoGenerate = true)" 와 같은 많은 답변 이 있습니다-귀하의 답변이이 글타래에 새로운 것을 추가합니까?
barbsan 2016 년

네, 그것은 추가합니다-그것은 null이 자동 생성 된 필드를 커버하는 방법을 보여줍니다
Marian Paździoch

5

예를 들어, users저장하려는 엔티티 가 있고 필드 (firstname, lastname , email)와 함께 자동 생성 된 ID를 원하는 경우이를 수행합니다.

@Entity(tableName = "users")
data class Users(
   @PrimaryKey(autoGenerate = true)
   val id: Long,
   val firstname: String,
   val lastname: String,
   val email: String
)

그런 다음 Room은 자동 생성되고 자동 증분 id됩니다.


22
새로운 Users 객체를 만들 때마다 id 필드를 전달해야합니다. 이것을 피할 수 있습니까?
Aditya Ladwa

11
예, 넣어 @PrimaryKey(autoGenerated = true) val id: Long? = null클래스의 몸에, 생성자 외부
앨런 벨로

1
@Magritte 케어 더 많은 pls를 정교하게?
Ispam

2
@Ispam 위의 대답에서 나는 완전한 수업의 모습을 게시했습니다.
Allan Veloso 2016 년

3
실제로, 당신은 단순히 ID를 0으로 넣을 수 있습니다. @PrimaryKey 옵션을 설정하면 Room에서 자동으로 ID를 생성합니다.
romaneso

1

위 코드로 Entity 클래스에 주석을 답니다.

자바에서

@PrimaryKey(autoGenerate = true)
private int id;

코 틀린에서

@PrimaryKey(autoGenerate = true)
var id: Int;

그런 다음 Room은 id 필드를 자동 생성하고 자동 증가시킵니다.

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