Android 安卓无法实例化工作进程

Android 安卓无法实例化工作进程,android,dagger-2,android-room,android-architecture-components,android-workmanager,Android,Dagger 2,Android Room,Android Architecture Components,Android Workmanager,我想从assets文件夹中的json文件预填充我的房间数据库。我遵循规则。我复制了SeedDatabaseWorker类: import android.content.Context import android.util.Log import androidx.work.Worker import androidx.work.WorkerParameters import com.dmitrysimakov.gymlab.data.GymLabDb import com.dmitrysima

我想从assets文件夹中的json文件预填充我的房间数据库。我遵循规则。我复制了SeedDatabaseWorker类:

import android.content.Context
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.dmitrysimakov.gymlab.data.GymLabDb
import com.dmitrysimakov.gymlab.data.entity.Training
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import javax.inject.Inject

class SeedDatabaseWorker(val context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    private val TAG = SeedDatabaseWorker::class.java.simpleName

    @Inject lateinit var database: GymLabDb

    override fun doWork(): Worker.Result {
        val plantType = object : TypeToken<List<Training>>() {}.type
        var jsonReader: JsonReader? = null

        return try {
            val inputStream = context.assets.open("training.json")
            jsonReader = JsonReader(inputStream.reader())
            val plantList: List<Training> = Gson().fromJson(jsonReader, plantType)
            database.trainingDao().insert(plantList)
            Worker.Result.SUCCESS
        } catch (ex: Exception) {
            Log.e(TAG, "Error seeding database", ex)
            Worker.Result.FAILURE
        } finally {
            jsonReader?.close()
        }
    }
}
导入android.content.Context
导入android.util.Log
导入androidx.work.Worker
导入androidx.work.WorkerParameters
导入com.dmitrysimakov.gymlab.data.GymLabDb
导入com.dmitrysimakov.gymlab.data.entity.Training
导入com.google.gson.gson
导入com.google.gson.reflect.TypeToken
导入com.google.gson.stream.JsonReader
导入javax.inject.inject
类SeedDatabaseWorker(val上下文:context,workerParams:WorkerParameters):Worker(上下文,workerParams){
private val TAG=SeedDatabaseWorker::class.java.simpleName
@注入lateinit变量数据库:GymLabDb
重写fun doWork():Worker.Result{
val plantType=object:TypeToken(){}.type
var jsonReader:jsonReader?=null
回击{
val inputStream=context.assets.open(“training.json”)
jsonReader=jsonReader(inputStream.reader())
val plantList:List=Gson().fromJson(jsonReader,plantType)
database.trainingDao().insert(plantList)
工人、结果、成功
}捕获(例如:异常){
Log.e(标签,“错误种子数据库”,ex)
工人、结果、失败
}最后{
jsonReader?.close()
}
}
}
我用的是匕首2,所以我没有这样做,而是这样做:

import android.arch.persistence.db.SupportSQLiteDatabase
import android.arch.persistence.room.Room
import android.arch.persistence.room.RoomDatabase
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.dmitrysimakov.gymlab.GymLabApp
import com.dmitrysimakov.gymlab.data.GymLabDb
import com.dmitrysimakov.gymlab.workers.SeedDatabaseWorker
import dagger.Module
import dagger.Provides
import javax.inject.Singleton

@Module(includes = [ViewModelModule::class])
class AppModule {

    @Singleton
    @Provides
    fun provideDb(app: GymLabApp): GymLabDb {
        return Room
                .databaseBuilder(app, GymLabDb::class.java, "gymlab.db")
                .addCallback(object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        val request = OneTimeWorkRequestBuilder<SeedDatabaseWorker>().build()
                        WorkManager.getInstance().enqueue(request)
                    }
                })
                .fallbackToDestructiveMigration()
                .build()
    }

    @Singleton
    @Provides
    fun provideTrainingDao(db: GymLabDb) = db.trainingDao()
}
导入android.arch.persistence.db.SupportSQLiteDatabase
导入android.arch.persistence.room.room
导入android.arch.persistence.room.RoomDatabase
导入androidx.work.OneTimeWorkRequestBuilder
导入androidx.work.WorkManager
导入com.dmitrysimakov.gymlab.GymLabApp
导入com.dmitrysimakov.gymlab.data.GymLabDb
导入com.dmitrysimakov.gymlab.workers.SeedDatabaseWorker
导入匕首模块
进口匕首。提供
导入javax.inject.Singleton
@模块(包括=[ViewModelModule::class])
类AppModule{
@独生子女
@提供
提供的乐趣B(应用程序:GymLabApp):GymLabDb{
休息室
.databaseBuilder(应用程序,GymLabDb::class.java,“gymlab.db”)
.addCallback(对象:RoomDatabase.Callback(){
重写FunonCreate(db:SupportSQLiteDatabase){
super.onCreate(db)
val request=OneTimeWorkRequestBuilder().build()
WorkManager.getInstance().enqueue(请求)
}
})
.fallbackToDestructiveMigration()
.build()
}
@独生子女
@提供
乐趣提供训练道(db:GymLabDb)=db.trainingDao()
}

但我无法注入尚未创建的数据库。那么,我如何访问dao呢?

您的问题是
种子数据库Worker
仍然基于
Worker()
,该构造函数现在已被弃用,因此您需要使用
Worker(上下文,WorkerParameters)
此构造函数

查看我的答案,它将帮助您理解
WorkManager

编辑:
您现在可以从Sunflower演示中进行检查,它已更新。

问题是我无法将数据库注入到Worker中。我在这里找到了解决方案:

@DmitrySimakov,只要看一次sunflower的例子,我相信你会理解的。但无论如何,我不能注入数据库,所以我无法获得dao。我来这里是因为alpha09的问题。您正确地提到
Worker()
已被弃用。但是,我可以确认此构造函数仍在使用,而不是较新的
Worker(上下文,WorkerParameters)
。现在,我将这两个构造函数都添加到我的worker实现中。我还犯了一个错误,使工人包受到保护。辅助程序实现需要是
公共的
。(我正在使用Java版本。)是的,而且
Worker()
计划在未来的版本中删除,这就是为什么建议您使用
Worker(上下文,WorkerParameters)