Android.Не удалось создать экземпляр Worker - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу предварительно заполнить базу данных Room из файла json в папке assets.Я следую за образцом Google Sunflower .Я скопировал класс 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()
        }
    }
}

Я использую Dagger 2, поэтому вместо этого: Sunflower AppDatabase , я делаю это:

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()
}

Но я не могу внедрить базу данных, которая еще не была создана.Итак, как я могу получить доступ к дао?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Проблема заключалась в том, что я не мог внедрить свою базу данных в Worker.Я нашел решение здесь: AndroidWorkerInjection

0 голосов
/ 21 сентября 2018

Ваша проблема в том, что SeedDatabaseWorker по-прежнему основан на Worker(), который устарел, поэтому вам нужно использовать Worker(Context, WorkerParameters) этот конструктор.

Проверьте мой ответ от другого поста , это поможет вам понять WorkManager библиотеку.

Редактировать:

Теперь вы можете проверить Работник из этой демонстрации Sunflower, оно обновлено.

...