复制项目后,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]
“原始”项目没有显示该错误
SQL pleasure 版本 1.5.3 android studio Chipmuck 2021.2.1
我正在使用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 -> {}));
 }
当前实现用于Observable.amb获取最新的2个流并返回db流,以防万一db有数据或服务器.为了防止在没有互联网的情况下早期失败,server有一个delaySubscription上面的200ms.
我尝试使用, …
通过重命名其中一个表并添加另一个表来修改sq文件后,我没有找到任何地方来指定数据库架构或版本已更改,并且我不想迁移 - 只需重新创建数据库。官方网站上的文档不包含任何有关此的信息。
项目可以编译,但是当我在 Android 和 iOS 上运行该应用程序时,我遇到运行时崩溃,并且在日志中显示添加的表不存在。
我尝试在共享模块的 build.gradle.kts 中添加版本,但仍然遇到运行时崩溃:
sqldelight {
   database("MyDatabase") {
      packageName = "com.example.shared.cache"
      version = 2 // added this line only
   }
}
我不想删除并重新安装该应用程序。理想的解决方案是类似于fallbackToDestructiveMigration Room 数据库
我发现了关于破坏性迁移的讨论。最后的评论建议在特定于平台的驱动程序中处理这个问题,但它没有显示如何做到这一点。
所以我的问题是:
我希望文档对各个主题更加详细。对于像我这样在 Sqlite 方面经验不是很丰富的开发人员来说,它可以更轻松地找到正确的信息。
我在 Android 应用程序中将数据保存到 sqldelight 1.4 时遇到问题。
我创建了表:
CREATE TABLE myTable(
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    name TEXT
);
在 repo 类中,我有以 myTable 对象作为参数的插入函数
fun insert(item: myTable) {
     myTableQueries.insert( 
        name = item.name
     )
}
在某些操作中,我尝试创建带有名称但没有 id 的新对象表,因为 id 是自动递增的。我没有找到任何信息如何做到这一点。哪个是最好的解决方案?
myTableViewModel.insert(name)
@Parcelize
class myTable(val name: String) : Parcelable
并在视图模型中使用参数?
谢谢
我正在尝试使用sqldelight插入项目,但在插入项目后还返回该项目的ID。在sqldelight中似乎没有办法做到这一点。
SELECT last_insert_rowid();插入后,我可以调用类似的名称,但这是前进的最佳方法吗?
我正在从事 kotlin 多平台项目。我成功地向我的 build.gradle 添加了几个库(ktor、协程等)。我还将 sqldelight 添加到 common、android 和 ios 源集。我的 ios 依赖是这样定义的:
 implementation "com.squareup.sqldelight:native-driver:1.4.0"
Gradle 说一切都很好。android编译代码:
actual fun createDb(): ToshlDatabase? {
val driver = AndroidSqliteDriver(ToshlDatabase.Schema, appContext, "toshl.db")
return ToshlDatabase(driver)
}
ios的代码没有,它没有找到“NativeSqliteDriver”:
actual fun createDb(): ToshlDatabase? {
val driver = NativeSqliteDriver(ToshlDatabase.Schema, "toshl.db");
return ToshlDatabase(driver)
}
我尝试使用旧版本的 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 …我正在尝试在 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
    }
}
建表语句:
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 …android kotlin android-studio sqldelight kotlin-multiplatform
我目前正在考虑拥有一个由 SQLdelight 支持的 KMM 应用程序,用于所有与域相关的操作。
SQLdelight 似乎提供了非常好的接口,但是似乎所有写入调用(插入/更新/删除)都是使用阻塞调用实现的,所以我担心它会通过大量阻塞主线程来损害应用程序的响应能力。
是否有推荐的方法来执行此类操作而不阻塞主线程?
该应用程序也必须在 iOS 上运行,所以我不能承受太多的冻结。
我想使用SQLDelight建模关系,尤其是一对多关系。
我有 2 个表:recipe和ingredient。为了简单起见,它们看起来像这样:
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
);
所以我有一个食谱列表,每个食谱可以包含 0-n 种成分。
我有2个目标:
我很确定第一个只能手动完成,例如插入食谱,然后手动插入关联的成分。
对于后者,我尝试使用以下语句连接表:
selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;
为此,SQLDelight 为我生成了一个 1:1 关系文件:
public data class SelectWithIngredients(
  public val …我有一个相对较大的数据库,可能需要 1 到 2 分钟才能初始化,是否可以在使用 sqldelight(kotlin 多平台)时加载预先填充的数据库,而不是在应用程序启动时初始化数据库?
sqldelight ×10
android ×7
kotlin ×5
ios ×2
kotlin-multiplatform-mobile ×1
relationship ×1
retrofit ×1
rx-java ×1
sqlbrite ×1
sqlite ×1