Проверьте, есть ли запись в списке liveata, не просматривая список - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь создать приложение, которое поможет мне отслеживать некоторые задачи, которые мы должны выполнить в игре.

У меня есть база данных Firebase Firestore, в которой хранятся все задачи, и я загружаю в приложение запускаю данные и добавляю только ту, которой у меня нет. Вот моя модель входа:

@Entity(tableName = "entry_table")
data class Entry(
    @PrimaryKey(autoGenerate = true) var uid: Long?,

    @ColumnInfo(name = "title") val title: String,
    @ColumnInfo(name = "description") val description: String,
    @ColumnInfo(name = "target") val target: Int = 0,
    @ColumnInfo(name = "position") val position: Int = 0,
    @ColumnInfo(name = "starred") val starred: Boolean = false

) {
    constructor(): this(null, "", "", 0, 0, starred = false)
}

Поскольку я загружаю документ из базы данных firestore, я не могу установить идентификатор перед вставкой записей в базу данных SQLite. Это означает, что я не могу использовать метод «Содержит» в моем списке Ливийных данных (поскольку записи, которые я получаю, имеют «нулевой» идентификатор, а тот из базы данных имеет идентификатор). Мне нужно зациклить все данные, вот код:

@WorkerThread
suspend fun insertEntry(entry: Entry) {
    for (doc in entriesList.value!!){
        if (doc.description == entry.description && doc.title == entry.title) {
            Log.d("MAIN_AC", "Entry already saved $entry")
            return
        }
    }
    entryDAO.insertEntry(entry)
}

Мой код работает, но я не удовлетворен им, есть ли лучший способ сделать это? Я надеялся, что метод содержимого может игнорировать некоторые аргументы (в моем случае это автоматически сгенерированный идентификатор)

1 Ответ

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

Один из способов, который вы можете использовать, предполагая, что вы используете Room, это аннотировать вашу функцию вставки (в соответствующем DAO) с помощью OnConflictStrategy.IGNORE.

, например

@Dao
interface EntryDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(list: List<Entry>)
    // or (if you want the inserted IDs)    
    // fun insert(list: List<Entry>) : LongArray
}   

Обязательно аннотируйте свою сущность соответствующим уникальным индексом.

, например

@Entity(tableName = "entry_table",
    indices = [Index(value = ["title", "description"], unique = true)]
       )
data class Entry(
    @PrimaryKey(autoGenerate = true) var uid: Long,
    @ColumnInfo(name = "title") val title: String,
    @ColumnInfo(name = "description") val description: String
    //...
                )

Первичные ключи не должны иметь нулевого значения, вы можете .map до Entry с uid = 0. Если вы используете одну и ту же модель сущностей как локально, так и удаленно, это, вероятно, не лучшая идея.

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