База данных номеров: вставленный ID всегда 0 - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать базу данных комнат из списка.Я следую примеру: https://medium.com/mindorks/room-kotlin-android-architecture-components-71cad5a1bb35

Вот мой класс данных:

@Entity(tableName = "itemData")
data class ItemData(@PrimaryKey(autoGenerate = true) var id: Long? = null,
                    @ColumnInfo(name = "text") var text: String,
                    @ColumnInfo(name = "checked") var checked: Boolean

)

DAO:

@Dao
interface ItemDataDAO {

    @Insert(onConflict = REPLACE)
    fun insert(itemData: ItemData) : Long
}

База данных:

@Database(entities = arrayOf(ItemData::class), version = 1)
abstract class ItemDatabase() : RoomDatabase() {


    abstract fun itemDataDao(): ItemDataDAO

    companion object {
        private var INSTANCE: ItemDatabase? = null

        fun getInstance(context: Context): ItemDatabase? {
            if (INSTANCE == null) {
                synchronized(ItemDatabase::class) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            ItemDatabase::class.java, "items.db")
                            .build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}

Рабочий поток:

class DbWorkerThread(threadName: String) : HandlerThread(threadName) {

    private lateinit var mWorkerHandler: Handler

    override fun onLooperPrepared() {
        super.onLooperPrepared()
        mWorkerHandler = Handler(looper)
    }

    fun postTask(task: Runnable) {
        mWorkerHandler.post(task)
    }
}

Вот слушатель, который вызывает функцию вставки:

editText.setOnEditorActionListener { v, actionId, event ->
    return@setOnEditorActionListener when (actionId) {
        EditorInfo.IME_ACTION_DONE -> {
            createItem(editText)
            true
        }
        else -> false
    }
}

Вот функция, которая вызывается для вставки элемента:

fun createItem(editText: EditText) {
    var text = editText.text.toString().trim()
    var itemData = ItemData(text = text, checked = false)
    var id : Long? = 0
    val task = Runnable {
        id = mDb?.itemDataDao()?.insert(itemData)
        println("inserted $id")
    }
    mDbWorkerThread.postTask(task)
}

Но идентификатор всегда равен 0, поэтому вставляется только один элемент.Кто-нибудь может увидеть проблему?

Я также пытался удалить значение null по умолчанию для id, но оно дает тот же результат.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Следующие изменения устранили проблему.

Вместо вызова конструктора, как это

var itemData = ItemData(text = text, checked = false)

Я вызвал конструктор по умолчанию, а затем установил параметры после построения.

var itemData = ItemData()
itemData.text = text
itemData.checked = false

Для этого требуется следующий конструктор для сущности ItemData:

constructor():this(null,"",false)
0 голосов
/ 12 ноября 2018

вы хотите добавить столбец автоинкремента:

@Entity(tableName = "item_data")
public class ItemData extends BaseObservable {

    /** Fields */
    @ColumnInfo(name = "item_id")
    @PrimaryKey(autoGenerate = true)
    private int itemId;

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...