Android 安卓无法实例化工作进程
我想从assets文件夹中的json文件预填充我的房间数据库。我遵循规则。我复制了SeedDatabaseWorker类: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
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)
。