【问题标题】:Execution failed for task ':app:kaptDevelopDebugKotlin'任务“:app:kaptDevelopDebugKotlin”执行失败
【发布时间】:2021-11-14 19:16:27
【问题描述】:

我遇到了构建错误,无法解决。 需要帮助

这是我的 stacktrace

> E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:22:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.Notification> p0);
>                                                                                           ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:21:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLastNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:21:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLastNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:27:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:26:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getNotificationCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:26:
> error: Unused parameter: p0
>     public abstract java.lang.Object getNotificationCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:18:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:17:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getBaseConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:17:
> error: Unused parameter: p0
>     public abstract java.lang.Object getBaseConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:23:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.BaseConfigurations> p0);
>                                                                                                 ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:22:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLatestBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:22:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLatestBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:27:
> error: Not sure how to handle query method's return type
> (java.lang.Object). UPDATE query methods must either return void or
> int (the number of updated rows).
>     public abstract java.lang.Object updateBaseConfigurationsEmail(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:30:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p2);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:27:
> error: Unused parameter: p2
>     public abstract java.lang.Object updateBaseConfigurationsEmail(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:18:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:17:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getAppConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:17:
> error: Unused parameter: p0
>     public abstract java.lang.Object getAppConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:23:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.AppConfigurations> p0);
>                                                                                                ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:22:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLatestAppConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:22:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLatestAppConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\developDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertAppConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:22:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.Notification> p0);
>                                                                                           ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:21:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLastNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:21:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLastNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:27:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:26:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getNotificationCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:26:
> error: Unused parameter: p0
>     public abstract java.lang.Object getNotificationCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\NotificationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertNotification(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:18:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:17:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getBaseConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:17:
> error: Unused parameter: p0
>     public abstract java.lang.Object getBaseConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:23:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.BaseConfigurations> p0);
>                                                                                                 ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:22:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLatestBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:22:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLatestBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:27:
> error: Not sure how to handle query method's return type
> (java.lang.Object). UPDATE query methods must either return void or
> int (the number of updated rows).
>     public abstract java.lang.Object updateBaseConfigurationsEmail(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:30:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p2);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:27:
> error: Unused parameter: p2
>     public abstract java.lang.Object updateBaseConfigurationsEmail(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\BaseConfigurationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertBaseConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:18:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super java.lang.Integer> p0);
>                                                               ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:17:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getAppConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:17:
> error: Unused parameter: p0
>     public abstract java.lang.Object getAppConfigCount(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:23:
> error: Query method parameters should either be a type that can be
> converted into a database column or a List / Array that contains such
> type. You can consider adding a Type Adapter for this.
>     kotlin.coroutines.Continuation<? super com.idware.uss.DataBase.DBModels.AppConfigurations> p0);
>                                                                                                ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:22:
> error: Not sure how to convert a Cursor to this method's return type
> (java.lang.Object).
>     public abstract java.lang.Object getLatestAppConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:22:
> error: Unused parameter: p0
>     public abstract java.lang.Object getLatestAppConfig(@org.jetbrains.annotations.NotNull()
>                                      ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:13:
> error: Type of the parameter must be a class annotated with @Entity or
> a collection/array of it.
>     kotlin.coroutines.Continuation<? super kotlin.Unit> p1);
>                                                         ^E:\Repo\uss\app\build\tmp\kapt3\stubs\reviewDebug\com\idware\uss\DataBase\DAO\AppConfigurationsDao.java:11:
> error: Not sure how to handle insert method's return type.
>     public abstract java.lang.Object insertAppConfig(@org.jetbrains.annotations.NotNull()

即使我更新了一些东西,但堆栈跟踪保持不变

DAO 的

NotificationsDao

    @Dao
    interface NotificationsDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insertNotification(notification: Notification)

    @Query("SELECT * from notifications where type = 0 ORDER BY date DESC")
    fun getAllSubscriberNotifications(): LiveData<List<Notification>>

    @Query("SELECT * FROM notifications ORDER BY date DESC LIMIT 1")
    suspend fun getLastNotification(): Notification?

    @Query("SELECT COUNT(*) FROM notifications WHERE type = 0 ")
    suspend fun getNotificationCount(): Int
}

BaseConfigurationsDao

    @Dao
    interface BaseConfigurationsDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insertBaseConfig(baseConfigurations: BaseConfigurations)


    @Query("SELECT COUNT(*) FROM base_configurations")
    suspend fun getBaseConfigCount(): Int

    @Query("SELECT * FROM base_configurations WHERE id = (SELECT MAX(id) FROM base_configurations) ")
    suspend fun getLatestBaseConfig(): BaseConfigurations?

    @Query("UPDATE base_configurations SET userEmail = :newEmail WHERE userEmail = :oldEmail")
    suspend fun updateBaseConfigurationsEmail(oldEmail: String, newEmail: String)
}

AppConfigurationsDao

    @Dao
    interface AppConfigurationsDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insertAppConfig(appConfigurations: AppConfigurations)

    @Query("SELECT COUNT(*) FROM app_configurations")
    suspend fun getAppConfigCount(): Int

    @Query("SELECT * FROM app_configurations WHERE id = (SELECT MAX(id) FROM app_configurations) ")
    suspend fun getLatestAppConfig(): AppConfigurations?
}

实体

通知

@Entity(tableName = DB_Constants.TABLE_NOTIFICATIONS)
class Notification(
    @ColumnInfo(name = "title")
    val title: String,

    @ColumnInfo(name = "body")
    val body: String,

    @ColumnInfo(name = "date")
    val dateReceived: Date,

    @ColumnInfo(name = "type")
    val notificationType: String,

    @ColumnInfo(name = "email")
    val notificationEmail: String,

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    val id: Int = 0
)

基础配置

@Entity(tableName = DB_Constants.TABLE_BASE_CONFIGURATIONS)
class BaseConfigurations(
    @ColumnInfo(name = "abc")
    val abc: String,

    @ColumnInfo(name = "xyz")
    val xyz: String,

    @ColumnInfo(name = "Email")
    val Email: String,

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    val id: Int = 0
)

应用配置

@Entity(tableName = DB_Constants.TABLE_APP_CONFIGURATIONS)
class AppConfigurations(
    @ColumnInfo(name = "brandingName")
    val brandingName: String?,

    @ColumnInfo(name = "copyrightText")
    val copyrightText: String?,

    @ColumnInfo(name = "bgColor")
    val bgColor: String?,

    @ColumnInfo(name = "fontColor")
    val fontColor: String?,

    @ColumnInfo(name = "logoUrl")
    val logoUrl: String?,

    @ColumnInfo(name = "Detail")
    val Detail: String?,

    @ColumnInfo(name = "Logo")
    val Logo: String?,

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    val id: Int = 0

)

转换器

class Converters {
    @TypeConverter
    fun fromTimestamp(value: Long): Date {
        return Date(value)
    }

    @TypeConverter
    fun dateToTimestamp(date: Date): Long {
        return date.time
    }
}

数据库

@Database(entities = [Notification::class, BaseConfigurations::class, 
AppConfigurations::class], version = DB_Constants.DB_VERSION)
@TypeConverters(Converters::class)
abstract class AbcDatabase : RoomDatabase() {

    abstract fun notificationsDao(): NotificationsDao
    abstract fun baseConfigurationsDao(): BaseConfigurationsDao
    abstract fun appConfigurationsDao(): AppConfigurationsDao

    companion object {
        private lateinit var instance: USSDatabase

        fun getDatabase(context: Context): USSDatabase {
            if (::instance.isInitialized)
                return instance

            synchronized(this) {
                instance = Room.databaseBuilder(
                    context.applicationContext,
                    AbcDatabase::class.java,
                    DB_Constants.DB_NAME
                )
                    .fallbackToDestructiveMigration()
                    .build()

                return instance
            }
        }
    }
}

【问题讨论】:

    标签: java android sqlite kotlin android-room


    【解决方案1】:

    问题 1

    AbcDatabase 中,在 companion object 中,您将实例定义为 USSDatabase 的类型,它应该是 AbcDatabase

    所以 AbcDatabase 可能是(注释掉不正确的代码):-

    @Database(entities = [Notification::class, BaseConfigurations::class,
        AppConfigurations::class], version = DB_Constants.DB_VERSION)
    @TypeConverters(Converters::class)
    abstract class AbcDatabase : RoomDatabase() {
    
        abstract fun notificationsDao(): NotificationsDao
        abstract fun baseConfigurationsDao(): BaseConfigurationsDao
        abstract fun appConfigurationsDao(): AppConfigurationsDao
    
        companion object {
            //private lateinit var instance: USSDatabase
            private lateinit var instance: AbcDatabase
    
            //fun getDatabase(context: Context): USSDatabase {
            fun getDatabase(context: Context): AbcDatabase {
                if (::instance.isInitialized)
                    return instance
    
                synchronized(this) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        AbcDatabase::class.java,
                        DB_Constants.DB_NAME
                    )
                        .fallbackToDestructiveMigration()
                        .build()
    
                    return instance
                }
            }
        }
    }
    

    问题 2

    BaseConfigurationsDao 中,您指的是名为 userEmail 的列,BaseConfiguration 实体使用 @ColumnInfo(name = "Email") val Email: String,。即列名称是 Email 而不是 userEmail

    所以 BaseConfigurationsDao 可能是:-

    @Dao
    interface BaseConfigurationsDao {
        @Insert(onConflict = OnConflictStrategy.IGNORE)
        suspend fun insertBaseConfig(baseConfigurations: BaseConfigurations)
    
    
        @Query("SELECT COUNT(*) FROM base_configurations")
        suspend fun getBaseConfigCount(): Int
    
        @Query("SELECT * FROM base_configurations WHERE id = (SELECT MAX(id) FROM base_configurations) ")
        suspend fun getLatestBaseConfig(): BaseConfigurations?
    
        /* Issue 1  column is not userEmail it is Email
        @Query("UPDATE base_configurations SET userEmail = :newEmail WHERE userEmail = :oldEmail")
        suspend fun updateBaseConfigurationsEmail(oldEmail: String, newEmail: String)
        */
    
        /* Fix 1 */
        @Query("UPDATE base_configurations SET Email = :newEmail WHERE Email = :oldEmail")
        suspend fun updateBaseConfigurationsEmail(oldEmail: String, newEmail: String)
    }
    
    • 又一次错误的代码被留下但被注释掉了。

    通过上述更改,您提供的代码和一个类 DB_Constants 如下:-

    class DB_Constants {
        companion object {
            const val TABLE_NOTIFICATIONS: String = "notifications"
            const val TABLE_BASE_CONFIGURATIONS: String = "base_configurations"
            const val TABLE_APP_CONFIGURATIONS: String = "app_configurations"
            const val DB_VERSION: Int = 1
            const val DB_NAME: String = "abc.db"
        }
    

    然后您的代码成功编译:-

    Executing tasks: [:app:assembleDebug] in project E:\AndroidStudioApps\SO69265290KotlinRoom
    
    > Task :app:preBuild UP-TO-DATE
    > Task :app:preDebugBuild UP-TO-DATE
    > Task :app:compileDebugAidl NO-SOURCE
    > Task :app:compileDebugRenderscript NO-SOURCE
    > Task :app:generateDebugBuildConfig UP-TO-DATE
    > Task :app:checkDebugAarMetadata UP-TO-DATE
    > Task :app:generateDebugResValues UP-TO-DATE
    > Task :app:generateDebugResources UP-TO-DATE
    > Task :app:mergeDebugResources UP-TO-DATE
    > Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
    > Task :app:extractDeepLinksDebug UP-TO-DATE
    > Task :app:processDebugMainManifest UP-TO-DATE
    > Task :app:processDebugManifest UP-TO-DATE
    > Task :app:processDebugManifestForPackage UP-TO-DATE
    > Task :app:processDebugResources UP-TO-DATE
    > Task :app:kaptGenerateStubsDebugKotlin
    > Task :app:javaPreCompileDebug UP-TO-DATE
    > Task :app:mergeDebugNativeDebugMetadata NO-SOURCE
    > Task :app:mergeDebugShaders UP-TO-DATE
    > Task :app:compileDebugShaders NO-SOURCE
    > Task :app:generateDebugAssets UP-TO-DATE
    > Task :app:mergeDebugAssets UP-TO-DATE
    > Task :app:compressDebugAssets UP-TO-DATE
    > Task :app:processDebugJavaRes NO-SOURCE
    > Task :app:checkDebugDuplicateClasses UP-TO-DATE
    > Task :app:desugarDebugFileDependencies UP-TO-DATE
    > Task :app:mergeExtDexDebug UP-TO-DATE
    > Task :app:mergeLibDexDebug UP-TO-DATE
    > Task :app:mergeDebugJniLibFolders UP-TO-DATE
    > Task :app:mergeDebugNativeLibs NO-SOURCE
    > Task :app:stripDebugDebugSymbols NO-SOURCE
    > Task :app:validateSigningDebug UP-TO-DATE
    > Task :app:writeDebugAppMetadata UP-TO-DATE
    > Task :app:writeDebugSigningConfigVersions UP-TO-DATE
    
    > Task :app:kaptDebugKotlin
    E:\AndroidStudioApps\SO69265290KotlinRoom\app\build\tmp\kapt3\stubs\debug\a\a\so69265290kotlinroom\AbcDatabase.java:8: warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
    public abstract class AbcDatabase extends androidx.room.RoomDatabase {
                    ^
    
    > Task :app:compileDebugKotlin
    > Task :app:compileDebugJavaWithJavac
    > Task :app:compileDebugSources
    > Task :app:dexBuilderDebug
    > Task :app:mergeDebugJavaResource
    > Task :app:mergeProjectDexDebug
    > Task :app:packageDebug
    > Task :app:assembleDebug
    
    Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
    Use '--warning-mode all' to show the individual deprecation warnings.
    See https://docs.gradle.org/7.0.2/userguide/command_line_interface.html#sec:command_line_warnings
    
    BUILD SUCCESSFUL in 6s
    30 actionable tasks: 8 executed, 22 up-to-date
    
    Build Analyzer results available
    
    }
    

    进行了一些调整以适应在主线程上运行

    • 在数据库构建中添加了 .allowMainThreadQueries
    • 从 dao 中删除了暂停

    并使用以下代码:-

    class MainActivity : AppCompatActivity() {
    
        lateinit var db: AbcDatabase
        lateinit var notificationsDao: NotificationsDao
        lateinit var appConfigurationsDao: AppConfigurationsDao
        lateinit var baseConfigurationsDao: BaseConfigurationsDao
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            db = AbcDatabase.getDatabase(this)
            notificationsDao = db.notificationsDao()
            appConfigurationsDao = db.appConfigurationsDao()
            baseConfigurationsDao = db.baseConfigurationsDao()
    
            baseConfigurationsDao.insertBaseConfig(BaseConfigurations("abc1","xyz1","email1"))
            appConfigurationsDao.insertAppConfig(AppConfigurations("brand1","brand1 copyright","red","black","brand1 url","brand1 detail","brand1 logo"))
            notificationsDao.insertNotification(
                Notification("Notification1","body for notfication1",
                    Date(),"type1","email1"))
            Log.d("BASECOUNT","Counts is ${baseConfigurationsDao.getBaseConfigCount()}")
            var  bc = baseConfigurationsDao.getLatestBaseConfig()
            baseConfigurationsDao.updateBaseConfigurationsEmail(bc!!.Email,bc!!.Email + " updated")
            Log.d("APPCOUNT","Count is ${appConfigurationsDao.getAppConfigCount()}")
            var ac = appConfigurationsDao.getLatestAppConfig()
            Log.d("NOTCOUNT","Count is ${notificationsDao.getNotificationCount()}")
            var n = notificationsDao.getLastNotification()
        }
    }
    

    代码运行成功,日志包括:-

    2021-09-22 07:36:39.948 D/BASECOUNT: Counts is 1
    2021-09-22 07:36:39.956 D/APPCOUNT: Count is 1
    2021-09-22 07:36:39.960 D/NOTCOUNT: Count is 0
    

    通过 Android Studio 的 App Inspector 生成的数据库是:-

    和:-

    • 请注意,电子邮件已相应更新

    和:-

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 2016-05-02
      • 2022-01-19
      • 2019-02-15
      • 2021-04-11
      相关资源
      最近更新 更多