SqlDelight/SQLite 没有正确执行连接?
SqlDelight/SQLite not executing joins properly?
我已将 SqlDelight 添加到我的多平台项目中,并创建了一些基本表和查询。
当我尝试使用更复杂的查询时,例如 JOINS
查询仍然执行并且生成的接口包含所有正确的字段,但实际对象不包含生成的数据。
GithubRepository.sq:
CREATE TABLE GithubRepository (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
Foobar.sq:
CREATE TABLE foobar (
id INTEGER NOT NULL PRIMARY KEY,
foobar TEXT NOT NULL,
repoId INTEGER NOT NULL,
FOREIGN KEY(repoId) REFERENCES GithubRepository(id)
);
findFoobars:
SELECT *
FROM foobar
LEFT JOIN GithubRepository ON GithubRepository.id = foobar.repoId;
insert:
INSERT INTO foobar VALUES ?;
现在,我通过几个测试来验证这是否有效,如下所示:
@Test
fun `Joins working?`() {
assertEquals(0, queries.findAll().executeAsList().size)
queries.insert(GithubRepository.Impl(2, "bar"))
foobarQueries.insert(Foobar.Impl(1, "foo", 2))
assertEquals("bar", foobarQueries.findFoobars().executeAsList()[0].name)
}
所有单个查询都成功,我可以按预期写入和读取所有表。
碰巧当使用 JOIN
访问查询时,加入的 属性 保持为空。
在更复杂的设置中,我还在 Android 模拟器上对此进行了测试,我可以从所有单独的表中读取,但不能从连接的字段中读取。
谁能指出我遗漏了什么?
经过更多试验后,我意识到我在 Android 上使用的是内存数据库。通过将数据库名称传递给 AndroidSqliteDriver
构造函数将其切换到基于文件的正确 SQLite 数据库后,JOINS
被正确执行并且预期的字段被正确填充。
这似乎是内存数据库驱动程序的限制。我希望将测试切换到基于文件的测试也能解决测试失败问题。
我已将 SqlDelight 添加到我的多平台项目中,并创建了一些基本表和查询。
当我尝试使用更复杂的查询时,例如 JOINS
查询仍然执行并且生成的接口包含所有正确的字段,但实际对象不包含生成的数据。
GithubRepository.sq:
CREATE TABLE GithubRepository (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
Foobar.sq:
CREATE TABLE foobar (
id INTEGER NOT NULL PRIMARY KEY,
foobar TEXT NOT NULL,
repoId INTEGER NOT NULL,
FOREIGN KEY(repoId) REFERENCES GithubRepository(id)
);
findFoobars:
SELECT *
FROM foobar
LEFT JOIN GithubRepository ON GithubRepository.id = foobar.repoId;
insert:
INSERT INTO foobar VALUES ?;
现在,我通过几个测试来验证这是否有效,如下所示:
@Test
fun `Joins working?`() {
assertEquals(0, queries.findAll().executeAsList().size)
queries.insert(GithubRepository.Impl(2, "bar"))
foobarQueries.insert(Foobar.Impl(1, "foo", 2))
assertEquals("bar", foobarQueries.findFoobars().executeAsList()[0].name)
}
所有单个查询都成功,我可以按预期写入和读取所有表。
碰巧当使用 JOIN
访问查询时,加入的 属性 保持为空。
在更复杂的设置中,我还在 Android 模拟器上对此进行了测试,我可以从所有单独的表中读取,但不能从连接的字段中读取。
谁能指出我遗漏了什么?
经过更多试验后,我意识到我在 Android 上使用的是内存数据库。通过将数据库名称传递给 AndroidSqliteDriver
构造函数将其切换到基于文件的正确 SQLite 数据库后,JOINS
被正确执行并且预期的字段被正确填充。
这似乎是内存数据库驱动程序的限制。我希望将测试切换到基于文件的测试也能解决测试失败问题。