标签: sqldelight

是否可以使用 sqldelight 从本地资源加载预填充的数据库

我有一个相对较大的数据库,可能需要 1 到 2 分钟才能初始化,是否可以在使用 sqldelight(kotlin 多平台)时加载预先填充的数据库,而不是在应用程序启动时初始化数据库?

kotlin sqldelight kotlin-multiplatform

6
推荐指数
2
解决办法
2130
查看次数

没有关于如何在 SQLDelight 中迁移现有数据库的适当文档

在一些堆栈溢出答案中,说 1.创建新表并删除旧表。怎么做?2.sqm文件有什么用,什么时候需要使用?3.在build.gradle中声明sqllight db时使用deriveSchemaFromMigrations标志是什么

database-migration sqldelight

6
推荐指数
0
解决办法
251
查看次数

SQLDelight 和 Kotlin 中具有一对多关系的数据类

我正在尝试使用 Kotlin Multiplatform 创建一个小型应用程序,在其中我可以保存书名及其作者,但我正在努力解决数据类以及如何将它们映射在一起,以便我获得作者及其所有书籍和发布日期。

CREATE TABLE book(
id INTEGER NOT NULL,
name TEXT NOT NULL,
publishDate INTEGER NOT NULL,
authorId INTEGER NOT NULL
)

CREATE TABLE author(
id INTEGER NOT NULL,
name TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这是我的数据类:

@Serializable
data class bookEntity(
  id: Int,
  name: String,
  authorId: Int
)

@Serializable
data class authorEntity(
  id: Int,
  authorName: String
  books: List<bookEntity>
)
Run Code Online (Sandbox Code Playgroud)

和我的查询:

selectAuthors:
SELECT * FROM author
JOIN book ON book.authorId = author.id
WHERE book.authorId = author.id
Run Code Online (Sandbox Code Playgroud)

我尝试了以下映射,但它不起作用:

private fun mapAuthor(
  id: …
Run Code Online (Sandbox Code Playgroud)

android kotlin data-class sqldelight kmm

6
推荐指数
1
解决办法
1246
查看次数

我们如何观察对 SQLDeLight DB 所做的特定更改并发出它们?

这是我的表结构

CREATE TABLE Missions(
    MissionID INTEGER NOT NULL UNIQUE,
    MilestoneID INTEGER NOT NULL,
    MissionExpiry TEXT,
    MissionStatus TEXT,
    Count INTEGER DEFAULT 0,
    MilestoneList TEXT,
    UpdatedTime TEXT,

    PRIMARY KEY (MissionID),
    CONSTRAINT fk_milestone FOREIGN KEY(MilestoneID)  REFERENCES Milestone(MilestoneID)
);
Run Code Online (Sandbox Code Playgroud)

我想每当上表中的计数属性更新时发出一个事件。

我写了一个这样的查询:

Val allItems: Flow<List<Item>> =
ItemQueries.selectAll().asFlow().mapToList()
Run Code Online (Sandbox Code Playgroud)

但是,每当表内的任何属性发生插入或更新并且所有行都被获取时,流程就会被触发。我只想获取已更新的行而不是所有行。我怎样才能完成它?

kotlin sqldelight kotlin-coroutines kmm

6
推荐指数
0
解决办法
634
查看次数

未生成 Sqldelight 数据库架构

我有一个 KMM 项目并想使用SqlDelight库,但是当我构建项目数据库架构时,没有生成表实体。

actual class DatabaseDriverFactory(private val context: Context) {
    actual fun createDriver(): SqlDriver {
               //Unresolved reference: CoreDb
        return AndroidSqliteDriver(CoreDb.Schema, context, "test.db")
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的共享模块中定义了 sqldelight 文件夹,还为功能生成的 kotlin 类创建了文件夹,因为它是在gradle.build.kts其中配置的,并且*.sqsqldelight文件夹中也有一个文件

sqldelight {
  database("CoreDb") {
    packageName = "com.example.app.core.database"
    sourceFolders = listOf("sqldelight")
    dialect = "sqlite:3.24"
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行generateSqlDelightInterface任务时,我只看到那些日志

> Task :core:generateAndroidDebugCoreDbInterface NO-SOURCE
> Task :core:generateAndroidReleaseCoreDbInterface NO-SOURCE
> Task :core:generateIosMainCoreDbInterface NO-SOURCE
> Task :core:generateMetadataCommonMainCoreDbInterface NO-SOURCE
> Task :core:generateMetadataMainCoreDbInterface NO-SOURCE
> Task :core:generateSqlDelightInterface UP-TO-DATE
can't …
Run Code Online (Sandbox Code Playgroud)

android gradle sqldelight kotlin-multiplatform

5
推荐指数
1
解决办法
1170
查看次数

ALTER TABLE 迁移不会更新生成的代码

我正在编写一个迁移文件,该文件会更改表,添加新列,但生成的代码未更新,因此我无法将新记录插入到具有新列值的表中。

例子:


// BankAccount.sq file
    
CREATE TABLE bank_account (
    id INTEGER PRIMARY KEY,
    bank_code TEXT NOT NULL,
    account_number INTEGER NOT NULL,
    account_digit INTEGER NOT NULL
);

selectALL:
SELECT * FROM bank_account;
    
insert:
INSERT INTO bank_account VALUES (?,?,?,?);

// 1.sqm file
ALTER TABLE bank_account ADD COLUMN bank_name TEXT;
Run Code Online (Sandbox Code Playgroud)

添加该列后,生成的代码似乎没有更新。例如,该insert函数不会更新以接收表中新添加的列,并且内部生成的 Kotlin 代码不会使用新列进行更新。

有什么办法可以绕过这个问题吗?

kotlin sqldelight

4
推荐指数
1
解决办法
1189
查看次数

我可以在同一项目中使用 sqldelight 与不同的数据库吗?

我想使用 SQLDelight 连接到 SQLite 内存数据库进行测试,并连接到 PostgreSQL 服务器进行生产,这种用例可能吗?我该如何进行配置?我是否需要为每个数据库准备 .sq 文件?

sqldelight

4
推荐指数
1
解决办法
1552
查看次数

如何在 KMM 上为 SQLDelight 编写单元测试

我想知道如何在KMM上为SQLDelight编写单元测试。首先,我什至无法正确添加SQLDelight依赖项。

    val commonTest by getting {
        dependencies {
            implementation(kotlin("test-common"))
            implementation(kotlin("test-annotations-common"))
            // SQLDelight tests
            implementation("com.squareup.sqldelight:sqlite-driver:1.4.3")
        }
    }
Run Code Online (Sandbox Code Playgroud)

在我添加依赖项然后同步项目后,该项目甚至没有构建。有人可以告诉我这是否是添加 sqlite 驱动程序依赖项的正确方法?

任何帮助将不胜感激!

unit-testing sqldelight kotlin-multiplatform kotlin-multiplatform-mobile

4
推荐指数
2
解决办法
2811
查看次数

从 ViewModel 中的 SqlDelight 收集流时出现 java.lang.IllegalStateException

我正在尝试在我的应用程序中使用 SqlDelight 数据库。

在我的 DAO 中,我有一个名为 getRecipeById 的函数来查询数据库并返回域模型流(Recipe)。下面是该函数的实现:(注:RecipeTable 是表的名称,或者我想我应该将其称为 RecipeEntity)

fun getRecipeById(id: Int): Flow<Recipe> {
    return recipeQueries.getRecipeById(id)
        .asFlow()
        .mapToOne()
        .map { recipeTable: RecipeTable ->
            recipeTableToRecipeMapper(recipeTable = recipeTable)
        }
}
Run Code Online (Sandbox Code Playgroud)

然后我的存储库像这样调用这个函数:(注意:recipeLocalDatabase 是我的 DAO)

suspend fun getRecipeById(id: Int): Flow<RecipeDTO> {
    val recipeFromDB: Flow<Recipe> = recipeLocalDatabase.getRecipeById(id)
    return recipeFromDB.map { recipe: Recipe ->
        recipeDTOMapper.mapDomainModelToDTO(recipe)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我的用例层从存储库调用该函数并传递流程:

suspend fun execute(
    id: Int
): UseCaseResult<Flow<RecipeDTO>>
{
    return try{
        UseCaseResult.Success(recipeRepository.getRecipeById(id))
    } catch(exception: Exception){
        UseCaseResult.Error(exception)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在 ViewModel 中,我正在收集 RecipeDTO 的流程,如下所示:

var recipeForDetailView: MutableState<RecipeDTO> = mutableStateOf( …
Run Code Online (Sandbox Code Playgroud)

android sqldelight kotlin-coroutines kotlin-flow

4
推荐指数
1
解决办法
2762
查看次数

与 Room 相比,SQLDelight 的性能较慢

我们想将我们的应用程序从 Room 迁移到 SQLDelight,以便在 iOS 上重用它(这是一个多平台项目)。但是我注意到 SQLDelight 比 Room 慢得多。对于某些查询,它大约慢 10 倍。我对插入语句进行了一些深入测试,Room 平均需要约 5 毫秒,SQLDelight 平均需要约 25 毫秒。我检查(并调整)了查询,使它们完全相同。

我还检查了一些 PRAGMA,发现 SQLDelight 使用 Pragma SYNCHRONOUS=1 (NORMAL) 而 Room 使用 2 (FULL) 而 SQLDelight 使用 JOURNAL_MODE=TRUNCATE 而 Room 使用 WAL。我将 SQLDelight 设置中的这些设置更改为等于 Room 并且性能有所提高,但对于上述测试仍然约为 20 毫秒。

有谁知道导致差异的原因是什么?任何帮助表示赞赏。

android sqldelight android-room kotlin-multiplatform

3
推荐指数
1
解决办法
890
查看次数