当前位置: 首页 > 知识库问答 >
问题:

Android Room[SQLITE_ERROR]使用Relation和Junction时SQL错误或丢失数据库

常鸿朗
2023-03-14

这是我的第一个问题。

我正在使用Room数据库构建一个应用程序,我试图遵循本教程,因为我需要实现多对多的关系。

但是,我一直得到以下错误,只要我尝试构建的应用程序:

错误:查询有问题:[SQLITE_ERROR]SQL错误或丢失数据库(没有这样的表: OwnerDogCrossRef)私有最终java.util.List dog=null;

我的实体,具有交叉引用数据类:

@Entity(tableName = "owner_table")
data class Owner(
    @ColumnInfo(name = "owner_id")
    val id: String,

    @PrimaryKey
    @ColumnInfo(name = "owner_name", index = true)
    val name: String,
    // some other columns

@Entity(tableName = "dog_table")
data class Dog(
    @PrimaryKey
    @ColumnInfo(name = "dog_name")
    val name: String
    // some other columns

@Entity(primaryKeys = ["owner_name", "dog_name"])//, "move_learned_by"])
data class OwnerDogCrossRef(
    val owner_name: String,
    @ColumnInfo(index = true)
    val dog_name: String
    // some other columns

我的连接数据类:

data class OwnerWithDogs(
    @Embedded val owner: Owner,

    @Relation(
        parentColumn = "owner_name",
        entityColumn = "dog_name",
        associateBy = Junction(OwnerDogCrossRef::class)
    )
    val dogs: List<Dog>
)

我的刀:

@Dao
inteface OwnerDao {
    @Transaction
    @Query("SELECT * FROM owner_table WHERE owner_name = :name")
    fun getOwnerWithDogs(name: String): LiveData<List<OwnerWithDogs>>
}

我还添加了OwnerDogCrossRef到我的数据库如下:

@Database(
    entities = [Owner::class, Dog::class, OwnerDogCrossRef::class],
    version = 2,
    exportSchema = false
)
@TypeConverters(Converters::class)
abstract class MainDatabase : RoomDatabase() {
    //some logic
}

谢谢你的帮助

共有2个答案

简滨海
2023-03-14
data class OwnerWithDogs(
    @Embedded val owner: Owner,

    @Relation(
        parentColumn = "owner_name",
        entity = Dog.class,
        entityColumn = "dog_name",
        associateBy = @Junction(
        value=OwnerDogCrossRef.class,
        parentColumn = "owner_name",//variable name in your OwnerDogCrossRef
        entityColumn = "dog_name")
    )
    val dogs: List<Dog>
)

试试这个代码。如需进一步了解,请尝试此链接
https://developer.android.com/reference/androidx/room/Junction

钱焕
2023-03-14

转到您的Database.kt文件,并确保交叉引用表已包含在那里的实体列表中。你的可能与下面的例子不同,但我希望你能看到你可能错过了什么。

@Database(entities = [Owner::class, Dog::class, OwnerDogCrossRef::class], version = 1)
abstract class AppDatabase : RoomDatabase() {

...

}

这是因为Owner、Dog和OwnerDogCrossRef都是数据库需要了解的表,而OwnerWithDogs只是将相关表加入到事务中,因为根据文档,将运行多个查询。有关显示如何包含特定数据库的实体的数据库文档,请参见此处。

 类似资料:
  • 我想使用同一种对象来查询多个表。我定义了一个基类,如下所示: 然后,我对基类进行了子类化,并为每个基类定义了DAO。 但是我一直得到一个编译错误,没有这样的表: abc,也没有这样的表: xyz。任何想法?

  • 我正在尝试使用新房间的图书馆,但我遇到了这个错误 错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:Station) 错误:不确定如何将游标转换为此方法的返回类型 MyDao.kt 实体

  • 我的Android应用程序中没有内置以下Dao: 当我在Android Studio3中构建项目时,我在gradle构建步骤中得到以下错误: 如果我删除loadAll函数,一切都像魅力一样工作...这个函数有什么问题?

  • 以上是我正在开发的Spark应用程序的主要方法。它涉及两个模板:loginform.ftl和result.ftl。ftl是一个简单的html表单,它向服务器发送post请求,由上面代码中的post处理程序处理。当我填写表单并发送请求时,我得到一个500内部服务器错误。这个错误与result.ftl有关,我现在用它来测试模板的制作。我将一个HashMap传递给result.ftl模板。我得到的错误是

  • 我有以下问题,当我运行testng套件时,我得到以下错误: “参数'paramName'是@test on method testMethod所必需的,但尚未标记为@OPtional o或已定义”。这里的所有问题都是正确的,这是我试图执行的代码的一部分: 如果此测试是,则扩展自基本测试,该测试在测试之前调用了以下方法 我不包括驱动程序被实例化的情况。如果有人知道会发生什么的话。

  • 我正在使用java,从服务器收到了一些json字符串。我收到了带有readUTF的json字符串,但是有一些数据丢失了。我没有收到每个json包的前两个字符。另一个问题是收到json字符串有延迟。例如,服务器发送了一个json字符串,客户端无法收到它,直到服务器和客户端发送的大约50个json字符串突然显示所有的json字符串。主要问题是什么? 因为服务器用UTF格式发送数据,所以我不能用Buff