标签: sqldelight

检测到重复的内容根

复制项目后,Android Studio 给出以下错误代码。

Duplicate content roots detected: Path [/home/addi/AndroidStudioProjects/appfolder/appname/app/build/generated/sqldelight/code/Database/debug] of module [appname.app.main] was removed from modules [appname.app.main]
Run Code Online (Sandbox Code Playgroud)

“原始”项目没有显示该错误

SQL pleasure 版本 1.5.3 android studio Chipmuck 2021.2.1

android kotlin android-studio sqldelight

16
推荐指数
1
解决办法
2万
查看次数

使用SqlBrite/SqlDelight(脱机数据库)和Retrofit(Http请求)的存储库模式

我正在使用SqlBrite/SqlDelight在RxJava中实现存储库模式以进行脱机数据存储并为Http请求进行改造

这是一个样本:

protected Observable<List<Item>> getItemsFromDb() {
     return database.createQuery(tableName(), selectAllStatement())
             .mapToList(cursor -> selectAllMapper().map(cursor));
 }


public Observable<List<Item>>getItems(){
     Observable<List<Item>> server = getRequest()
                 .doOnNext(items -> {
                     BriteDatabase.Transaction transaction = database.newTransaction();
                     for (Item item : items){
                         database.insert(tableName(), contentValues(item));
                     }
                     transaction.markSuccessful();
                     transaction.end();
                 })
                 .flatMap(items -> getItemsFromDbById())
                 .delaySubscription(200, TimeUnit.MILLISECONDS);
         Observable<List<Item>> db = getItemsFromDbById(id)
                 .filter(items -> items != null && items.size() > 0);
     return Observable.amb(db, server).doOnSubscribe(() -> server.subscribe(items -> {}, throwable -> {}));
 }
Run Code Online (Sandbox Code Playgroud)

当前实现用于Observable.amb获取最新的2个流并返回db流,以防万一db有数据或服务器.为了防止在没有互联网的情况下早期失败,server有一个delaySubscription上面的200ms.

我尝试使用, …

android rx-java retrofit sqlbrite sqldelight

12
推荐指数
1
解决办法
543
查看次数

如何查看/更新数据库版本?有类似“fallbackToDestructiveMigration”之类的东西吗?

通过重命名其中一个表并添加另一个表来修改sq文件后,我没有找到任何地方来指定数据库架构或版本已更改,并且我不想迁移 - 只需重新创建数据库。官方网站上的文档不包含任何有关此的信息。

项目可以编译,但是当我在 Android 和 iOS 上运行该应用程序时,我遇到运行时崩溃,并且在日志中显示添加的表不存在。

我尝试在共享模块的 build.gradle.kts 中添加版本,但仍然遇到运行时崩溃:

sqldelight {
   database("MyDatabase") {
      packageName = "com.example.shared.cache"
      version = 2 // added this line only
   }
}
Run Code Online (Sandbox Code Playgroud)

我不想删除并重新安装该应用程序。理想的解决方案是类似于fallbackToDestructiveMigration Room 数据库

我发现了关于破坏性迁移的讨论。最后的评论建议在特定于平台的驱动程序中处理这个问题,但它没有显示如何做到这一点。

所以我的问题是:

  1. 如何更改数据库版本?
  2. 如何设置破坏性迁移?

我希望文档对各个主题更加详细。对于像我这样在 Sqlite 方面经验不是很丰富的开发人员来说,它可以更轻松地找到正确的信息。

android ios sqldelight kotlin-multiplatform

8
推荐指数
1
解决办法
2586
查看次数

Sqldelight 1.4 如何插入填充数据生成没有主键(id)的对象

我在 Android 应用程序中将数据保存到 sqldelight 1.4 时遇到问题。

我创建了表:

CREATE TABLE myTable(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT
);
Run Code Online (Sandbox Code Playgroud)

在 repo 类中,我有以 myTable 对象作为参数的插入函数

fun insert(item: myTable) {
     myTableQueries.insert( 
        name = item.name
     )
}
Run Code Online (Sandbox Code Playgroud)

在某些操作中,我尝试创建带有名称但没有 id 的新对象表,因为 id 是自动递增的。我没有找到任何信息如何做到这一点。哪个是最好的解决方案?

  1. 创建一个与数据类(myTable)参数相同的新类(myTablexpress),在repo类中的insert函数的参数中使用这个对象,并使用这些参数?
  2. 不在操作类中创建新的 myTable 实例,而是使用插入函数并将字符串值作为参数?
myTableViewModel.insert(name)
Run Code Online (Sandbox Code Playgroud)
  1. 创建没有 id 的新类 myTable
@Parcelize
class myTable(val name: String) : Parcelable
Run Code Online (Sandbox Code Playgroud)

并在视图模型中使用参数?

  1. 他们都没有

谢谢

android kotlin sqldelight

8
推荐指数
1
解决办法
4414
查看次数

获取在sqldelight中插入的行的行ID

我正在尝试使用sqldelight插入项目,但在插入项目后还返回该项目的ID。在sqldelight中似乎没有办法做到这一点。

SELECT last_insert_rowid();插入后,我可以调用类似的名称,但这是前进的最佳方法吗?

sqlite sqldelight

7
推荐指数
1
解决办法
172
查看次数

将 sqldelight 的“未解析参考:NativeSqliteDriver”添加到 ios 源集

我正在从事 kotlin 多平台项目。我成功地向我的 build.gradle 添加了几个库(ktor、协程等)。我还将 sqldelight 添加到 common、android 和 ios 源集。我的 ios 依赖是这样定义的:

 implementation "com.squareup.sqldelight:native-driver:1.4.0"
Run Code Online (Sandbox Code Playgroud)

Gradle 说一切都很好。android编译代码:

actual fun createDb(): ToshlDatabase? {
val driver = AndroidSqliteDriver(ToshlDatabase.Schema, appContext, "toshl.db")
return ToshlDatabase(driver)
Run Code Online (Sandbox Code Playgroud)

}

ios的代码没有,它没有找到“NativeSqliteDriver”:

actual fun createDb(): ToshlDatabase? {
val driver = NativeSqliteDriver(ToshlDatabase.Schema, "toshl.db");
return ToshlDatabase(driver)
Run Code Online (Sandbox Code Playgroud)

}

我尝试使用旧版本的 com.squareup.sqldelight 但它没有帮助。这个东西怎么调试?

编辑:我共享的 build.gradle:

plugins {
id("org.jetbrains.kotlin.multiplatform")
id("com.android.library")
id ("org.jetbrains.kotlin.native.cocoapods")
id("kotlinx-serialization")
id("com.squareup.sqldelight")
 }

ext.coroutine_version = '1.3.5-native-mt'
ext.serializer_version = '0.20.0'
ext.ktor_version = '1.3.2'
ext.sqlDelight_version= '1.4.0'


android {
compileSdkVersion 29
buildToolsVersion '30.0.0'

defaultConfig {
    minSdkVersion 21 …
Run Code Online (Sandbox Code Playgroud)

android ios sqldelight kotlin-multiplatform

7
推荐指数
1
解决办法
1140
查看次数

SQLDelight 迁移

我正在尝试在 SQLDelight 的表中添加更多列。我制作了一个迁移文件1.sqm。在迁移文件中,它给出了没有找到表的错误。在此输入图像描述

我的 build.gradle.kts:

sqldelight {
    database("AppDatabase") {
        packageName = "com.jetbrains.handson.kmm.shared.cache"
        schemaOutputDirectory = file("shared/src/commonMain/sqldelight/com/jetbrains/handson/kmm/shared/cache/AppDatabase.sq")
        migrationOutputDirectory = file("shared/src/commonMain/sqldelight/migrations/1.sqm")
        migrationOutputFileFormat = ".sqm" 
        schemaOutputDirectory
        deriveSchemaFromMigrations = true
    }
}
Run Code Online (Sandbox Code Playgroud)

建表语句:

CREATE TABLE pos_orders(id INTEGER AS Int PRIMARY KEY, orderId INTEGER AS Int , dateandtime TEXT, restaurant_id INTEGER AS Int, restaurant_name TEXT, deliveryType_description TEXT, paymentType_description TEXT, totalAmount REAL AS Float,
process_order INTEGER AS Int, pos_accept INTEGER AS Int, pos_printed INTEGER AS Int, status INTEGER AS Int, prep_time INTEGER AS Int, desired_delivery_time …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-studio sqldelight kotlin-multiplatform

7
推荐指数
1
解决办法
4059
查看次数

如何在后台线程中执行查询?

我目前正在考虑拥有一个由 SQLdelight 支持的 KMM 应用程序,用于所有与域相关的操作。

SQLdelight 似乎提供了非常好的接口,但是似乎所有写入调用(插入/更新/删除)都是使用阻塞调用实现的,所以我担心它会通过大量阻塞主线程来损害应用程序的响应能力。

是否有推荐的方法来执行此类操作而不阻塞主线程?

该应用程序也必须在 iOS 上运行,所以我不能承受太多的冻结。

sqldelight kotlin-multiplatform-mobile

7
推荐指数
1
解决办法
679
查看次数

SQLDelight关系

我想使用SQLDelight建模关系,尤其是一对多关系。

我有 2 个表:recipeingredient。为了简单起见,它们看起来像这样:

CREATE TABLE recipe (
  id INTEGER NOT NULL PRIMARY KEY,
  name TEXT NOT NULL
)

CREATE TABLE ingredient (
  recipe_id INTEGER NOT NULL,
  name TEXT NOT NULL,
  FOREIGN KEY (recipe_id) REFERENCES recipe(id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

所以我有一个食谱列表,每个食谱可以包含 0-n 种成分。

我有2个目标:

  • 写一个包含所有成分的食谱
  • 阅读包含所有成分的食谱

我很确定第一个只能手动完成,例如插入食谱,然后手动插入关联的成分。

对于后者,我尝试使用以下语句连接表:

selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;
Run Code Online (Sandbox Code Playgroud)

为此,SQLDelight 为我生成了一个 1:1 关系文件:

public data class SelectWithIngredients(
  public val …
Run Code Online (Sandbox Code Playgroud)

android relationship kotlin sqldelight

7
推荐指数
1
解决办法
4327
查看次数

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

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

kotlin sqldelight kotlin-multiplatform

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