Oda Kalıcılığı lib için otomatik yineleme olarak birincil anahtar nasıl yapılır


196

foodIdAutoincrement olarak yapmak istediğim bir Entity (Room Persistence lib) sınıfı Food oluşturuyorum .

@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()
}

foodIdBir otomatik görüntüleme alanını nasıl ayarlayabilirim ?


4
Bunun yerine bunu bir double olarak 0.toDouble()kullanabilirsiniz0.0
RobCo

2
Yeni bir Food sınıfı örneği nasıl oluşturulur? Manuel olarak kimlik belirtiyor musunuz veya boş bırakıyor musunuz?
Zookey

3
Gelecekteki okuyucular için bir not - Oda'nın ayarlanmamış olarak işlemesi için birincil anahtar 0 olmalıdır. Başka bir varsayılan değer (örn. -1) kullanırsanız, Oda kimliği otomatik olarak oluşturmaz.
Martin Melka

Yanıtlar:


375

autoGenerateMülkü kullanmanız gerekiyor

Birincil anahtar ek açıklamanız aşağıdaki gibi olmalıdır:

@PrimaryKey(autoGenerate = true)

PrimaryKey için referans .


3
Teşekkürler, autoIncrement'ı arıyordum, bu yüzden neden bulamadık.
chandil03

Hey @MatPag Bir tabloda iki birincil anahtar (Bileşik birincil anahtarlar) ve birincil anahtarlardan birinin otomatik olarak artırılması gerekiyorsa ne olur? Bunu nasıl başarabilirim? Bu cevap verebilir burada ?
Priyanka Alachiya

1
@MatPeg Bir PrimaryKey sahip olmak istersem, kendi ürettiği ve REST'ten gelen bir tane olması durumunda ne olur @Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))?
murt

murt Bileşik bir birincil anahtara ihtiyacınız var, ancak elde etmek istediğinizi yapamazsınız. Burada
MatPag

Bağlantılı belgelerin önemli kısmı:Insert methods treat 0 as not-set while inserting the item.
Micha

127

Şöyle ekleyebilirsiniz @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 olması gerekmez (ama olabilir). Ayrıca varsayılan değerler de kullanılabilir. var foodId: Int = 0ve otojenerasyon düzgün çalışır.
Michał Baran

8
@ MichałBaran, java doc'den, tür ilkel bir java olduğunda intveya long0, null olarak değerlendirilir, tür Integer veya Long olduğunda, null null değerdir. Null olmayan JVM'de ilkel int olarak çalıştığında Kotlin Int olduğundan, haklısınız ve var foodId: Int = 0çalışacaksınız, ancak var foodId: Int? = 0Int'den beri çalışmayacak mı? JVM'de Tamsayı olarak dönüştürülür. @JMK, 0 yaparsanız, intyukarıda belirtilen nedenden ötürü boş bırakılamaz olmanız gerekir .
Allan Veloso

3
Başka bir şekilde yazabilirsiniz: val jack = User(name = "Jack", phone= 1)Bu durumda, 0
yapıcıdan

2
@AllanVeloso Neden yapıcıya foodIddeğil de vücuda konulduğunu açıklayabilir misiniz ?
Neeraj Sewani

2
foodId, yerleştirme sırasında Oda tarafından otomatik olarak oluşturulacağından, büyük olasılıkla yapıcıda kullanılmasının bir faydası olmayacaktır.
Allan Veloso

42

Ekle @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;
    }

}

veri saklarken

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

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

tip-1

Birincil anahtar için değer iletmiyorsanız, varsayılan olarak 0 veya null olur.

Tip 2

Nesne oluştururken kimlik için null veya sıfır koy (benim durumum kullanıcı nesnesi)

Alan türü uzun veya int ise (veya TypeConverter bunu uzun veya int değerine dönüştürürse), Insert yöntemleri öğeyi eklerken 0 ayarlanmamış olarak kabul eder.

Alanın türü Tamsayı veya Uzun (Nesne) ise (veya TypeConverter onu bir Tamsayı veya Uzuna dönüştürür), Ekle yöntemleri öğeyi eklerken null değerini ayarlanmamış olarak kabul eder.


1
AutoGenerate olarak ayarlanmış olsa bile Entity'ye özel kimlik verebilir miyiz?
IgorGanapolsky

2
@Igor Ganapolsky Evet, ancak giriş bu özel kimlikle üretilecektir [otomatik artış çalışmaz] Ve aynı kimliği tekrar iletirseniz, 'BENZERSİZ kısıtlama başarısız oldu' istisnasını atar, bu nedenle her zaman yeni kimliği geçmeniz veya yapmanız gerekir [0 veya null] 'a gidin ve otomatik artırmanın bu işlemi sizin için yapmasına izin verin.
kunal khedkar

3
Neden otomatik olarak oluşturmak istiyorsanız kullanıcının kimliği yapıcıya koymasına izin veriyorsunuz?
hellcast

Kotlin'de veri sınıfını kullanabilir ve yazabilirsiniz: val jack = User(name = "Jack", phone= 1)Bu durumda
yapıcıdan 0'ı

@hellcast Eğer DB sorgulamak zaman (sadece zor yoldan öğrendim gibi) yapıcı kimliğini dahil etmiyorsanız o id alanı atamaz (sadece yapıcı ile başlattığınızda ne olacak) Nesnenin alanlarını doldururken aynı yapıcı çağırıyor varsayalım.
Ali Hirani

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
Bu kod snippet'i çözüm olsa da, bir açıklama da dahil olmak üzere mesajınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Johan

4
"Kullan @PrimaryKey(autoGenerate = true)" gibi birçok cevap var - Cevabınız bu konuya yeni bir şey ekliyor mu?
barbsan

evet ekler - null
otojenear

5

Örneğin, usersdepolamak istediğiniz, alanlara sahip bir varlığınız varsa (firstname, lastname , email)ve otomatik olarak oluşturulan kimlik istiyorsanız, bunu yaparsınız.

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

Oda daha sonra alanı otomatik olarak oluşturur ve otomatik olarak artırır id.


22
Her yeni kullanıcı nesnesi oluşturduğumuzda bir kimlik alanı geçirmemiz gerekir. Bu önlenebilir mi?
Aditya Ladwa

11
Evet, @PrimaryKey(autoGenerated = true) val id: Long? = nullinşaatçının dışına, sınıfın gövdesine
Allan Veloso

1
@Magritte Daha fazla özen göstermek ister misiniz?
Ispam

2
@Ispam Yukarıdaki cevabımda tüm sınıfın nasıl görünmesi gerektiğini yayınladım.
Allan Veloso

3
Aslında, 0'ı kimlik olarak koyabilirsiniz. @PrimaryKey seçeneğini ayarladıysanız oda otomatik olarak bir kimlik oluşturur.
romaneso

1

Entity sınıfınıza yukarıdaki kodla not ekleyin.

Java dilinde

@PrimaryKey(autoGenerate = true)
private int id;

Kotlin bölgesinde

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

Oda daha sonra otomatik olarak oluşturulur ve kimlik alanını otomatik olarak artırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.