【问题标题】:how to store basic D&D stats within my app using room, in such a way that they can be edited and retrieved如何使用房间在我的应用程序中存储基本的 D&D 统计数据,以便可以编辑和检索它们
【发布时间】:2019-10-02 06:49:57
【问题描述】:

我正在尝试为我的 D&D 小组编写一个应用程序,其中一个功能是存储小组的角色统计数据,我将在应用程序中显示这些数据。

我去了以下教程和文档来尝试学习如何做到这一点, https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#0 https://developer.android.com/training/data-storage/room/defining-data.html https://developer.android.com/guide/topics/data/data-storage 我掌握了基础知识,并在我的项目中创建了一个新的 kotlin 文件来定义实体、Dao 等,并将发布我的代码我已经走了多远,但是在试图让它工作时已经到达了我的理解的死胡同。我正在尝试做一些尽可能少的事情并使其正常工作,然后将其扩展以存储其他角色统计信息。

stats.kt

package com.taylorworld.tw01

import androidx.lifecycle.LiveData
import androidx.room.*

@entity (tablename = "stat_table")
data class Stats(
    @ColumnInfo(name = "stat") val stat: string,
    @PrimaryKey val num: Int)
)

@Dao
interface StatDao {
    @Query("SELECT stat from stat_table")
    fun getStats(): LiveData<<List<Stats>

    @Insert
    suspend fun insert(stat: Stats)
}
@Abstract val statDao: StatDao{}

当我尝试编译项目时,我收到以下错误消息。 https://imagebin.ca/v/4h9cpZurjoA2

【问题讨论】:

  • 应该是@Entity, String
  • 大写 E 和 S?
  • 是的,Java 和 Kotlin 都区分大小写。
  • 谢谢,我已经记下了,:)
  • 任何更新????

标签: android kotlin android-room


【解决方案1】:

我建议你将Entity类和Dao接口移动到不同的类。

package com.taylorworld.tw01

import androidx.lifecycle.LiveData
import androidx.room.*
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity (tableName = "stat_table")
data class Stats(
    @ColumnInfo(name = "stat") val stat: String,
    @PrimaryKey val num: Int)

@Dao
interface StatDao {
    @Query("SELECT stat from stat_table")
    fun getStats(): LiveData<List<Stats>>

    @Insert
    suspend fun insert(stat: Stats)

    @Abstract val statDao: StatDao{}
}

【讨论】:

  • 分成两个单独的文件?
  • 不要把它们拿出来。
  • imagebin.ca/v/4h9mDrglPqrL 我把它们都放在 stats.kt 中,我得到的错误更少。
  • 你错过了导入一些参考。使用鼠标指向红线。你应该得到错误。
  • 在顶部添加 import kotlinx.android.parcel.Parcelize
【解决方案2】:

您知道访问 DAO 需要 RoomDatabase 吗?它可能看起来像这样:

@Database(
  entities = [(Stats::class)],
  version = 1,
  exportSchema = false
)
abstract class DDDatabase : RoomDatabase() {

  abstract fun statDao(): StatDao

  private var inst: DDDatabase? = null
  private val instLock = Object()

  fun getInstance(context: Context): DDDatabase = inst ?: synchronized(instLock) {
    return inst ?: run {
      inst = Room.databaseBuilder(
        context,
        DDDatabase::class.java, "name of the database"
      ).build()
      inst!!
  }
}

}

但是我使用 applicationContext 而不是注入上下文。然后您可以按如下方式使用它:

DDDatabase.getDatabase().statDao().getStats()

但是,我发现您的 getStats 查询构造不正确。如果你想要数据库中的所有 Stats 应该写成:

@Query("SELECT * from stat_table")
    fun getStats(): LiveData<List<Stats>>

如果对您有用,请将答案标记为已批准,否则请回复我:)

【讨论】:

  • 我将您上面发布的 RoomDatabase 添加到 stats.kt 中,结果出现以下错误,imagebin.ca/v/4hJeR9Jxm8R1,据我了解,我检查了它,它看起来正确。
  • 我看到其他人也遇到了同样的问题,我不确定是什么原因造成的,但您可以尝试此处所述的解决方案:stackoverflow.com/questions/44485631/… 现在更清楚一点,数据库类应该与 DAO 分开。 DAO 只是一个生成的接口,它帮助生成将访问您的数据库的类。除了您的 StatsDao 之外,我在回答中所说的类应该存在,因此您应该能够保持 StatsDao 和实体原样
  • 如果不清楚,请回复我。正如@JohnJoe 所说,我还建议您将实体和 DAO 分成两个不同的类。
  • github.com/brobostigon/TW01/blob/master/app/src/main/java/com/… 我按照@JohnJoe 的建议将实体和 DAO 分开。 imagebin.ca/v/4hO8AbCIyPCd 我按照您的建议将数据库分隔成单独的内容,导致该图片中显示的错误。
  • 我做了一些更改,github.com/brobostigon/TW01/commit/…,它肯定会更进一步,留下以下错误,imagebin.ca/v/4hP7SICXFXSr“期待顶级声明”。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 2017-05-20
  • 2011-12-28
相关资源
最近更新 更多