Я создаю Entity ( Room Persistence Library ) класса Food, где хочу сделать foodId
автоинкремент.
@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
поле автоинкремента?
android
kotlin
android-room
chandil03
источник
источник
0.toDouble()
чтобы использовать0.0
, объявите это как двойноеОтветы:
Вам нужно использовать
autoGenerate
недвижимостьВаша аннотация первичного ключа должна быть такой:
@PrimaryKey(autoGenerate = true)
Ссылка на PrimaryKey .
источник
@Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))
?Insert methods treat 0 as not-set while inserting the item.
Вы можете добавить
@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() }
источник
foodId
не обязательно должно быть нулевым (но может быть). Можно также использовать значения по умолчанию, например.var foodId: Int = 0
и автогенерация будет работать правильно.int
илиlong
0 рассматривается как допускающий значение NULL, когда тип Integer или Long, null является допускающим значение NULL. Поскольку Kotlin Int, когда не допускает значения NULL, работает в JVM как примитивный int, то вы правы иvar foodId: Int = 0
будете работать, ноvar foodId: Int? = 0
не будет работать, поскольку Int? преобразуется в JVM как целое число. @JMK, если вы сделаете это 0, вы ДОЛЖНЫ сделать значение, не допускающее значение NULL,int
по вышеупомянутой причине.val jack = User(name = "Jack", phone= 1)
в этом случае вы можете удалить 0 из конструктораfoodId
было помещено в тело, а не в конструктор?Добавить
@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));
тип-2
Поместите ноль или ноль для идентификатора при создании объекта (мой пользовательский объект)
Если тип поля long или int (или его TypeConverter преобразует его в long или int), методы Insert обрабатывают 0 как не установленное при вставке элемента.
Если тип поля - Integer или Long (Object) (или его TypeConverter преобразует его в Integer или Long), методы Insert обрабатывают null как неустановленное при вставке элемента.
источник
val jack = User(name = "Jack", phone= 1)
В этом случае вы можете удалить 0 из конструктора@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, "","","","") }
источник
@PrimaryKey(autoGenerate = true)
» - добавляет ли ваш ответ что-нибудь новое в эту ветку?Например, если у вас есть
users
объект, который вы хотите сохранить, с полями(firstname, lastname , email)
и вам нужен автоматически сгенерированный идентификатор, вы делаете это.@Entity(tableName = "users") data class Users( @PrimaryKey(autoGenerate = true) val id: Long, val firstname: String, val lastname: String, val email: String )
Затем Room автоматически сгенерирует и автоматически увеличит значение
id
поля.источник
@PrimaryKey(autoGenerated = true) val id: Long? = null
за пределы конструктора, на тело классаЭто невероятно после такого количества ответов, но в конце концов я сделал это немного иначе. Мне не нравится, что первичный ключ допускает значение NULL, я хочу, чтобы он был первым аргументом, а также хочу вставить его без его определения, а также не должен быть var.
@Entity(tableName = "employments") data class Employment( @PrimaryKey(autoGenerate = true) val id: Long, @ColumnInfo(name = "code") val code: String, @ColumnInfo(name = "title") override val name: String ){ constructor(code: String, name: String) : this(0, code, name) }
источник
Это работает для меня:
@Entity(tableName = "note_table") data class Note( @ColumnInfo(name="title") var title: String, @ColumnInfo(name="description") var description: String = "", @ColumnInfo(name="priority") var priority: Int, @PrimaryKey(autoGenerate = true) var id: Int = 0//last so that we don't have to pass an ID value or named arguments )
Обратите внимание, что идентификатор является последним, чтобы избежать использования именованных аргументов при создании объекта перед его вставкой в Room. После того, как он был добавлен в комнату, используйте идентификатор при обновлении объекта.
источник
Аннотируйте свой класс Entity с помощью кода ниже.
В Java:
@PrimaryKey(autoGenerate = true) private int id;
В Котлине:
@PrimaryKey(autoGenerate = true) var id: Int
Затем Room автоматически сгенерирует и автоматически увеличит значение поля id.
источник