우선 에러부터 잡자!
@InstallIn(SingletonComponent::class)
@Module
class DatabaseModule {
@Singleton
@Provides
fun provideAppDatabase(@ApplicationContext context: Context):AppDatabase{
return AppDatabase.getInstance(context)
}
@Provides
fun providePlantDao(appDatabase: AppDatabase): PlantDao{
return appDatabase.plantDao()
}
}
@Entity(tableName = "garden_plantings", foreignKeys = [ForeignKey(entity = Plant::class, parentColumns = ["id"], childColumns = ["plant_id"])], indices = [Index("plant_id")])
data class GardenPlanting(
@ColumnInfo(name = "plant_id") val plantId : String,
@ColumnInfo(name = "plant_data") val plantDate : Calendar = Calendar.getInstance(),
@ColumnInfo(name = "last_watering_date") val lastWateringDate : Calendar = Calendar.getInstance()
){
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id") var gardenPlantingId:Long = 0
}
@Entity, @ColumnInfo, @PrimaryKey 모두 room에 속해있는 기능이다. 따라서 room을 정리할 때 이부분에 대해서는 정리할 예정이다
다시 AppDatabase로 돌아와 이어서 작성해주자
@Database(entities = [GardenPlanting::class, Plant::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun plantDao(): PlantDao
companion object{
@Volatile private var instance : AppDatabase? = null
fun getInstance(context: Context): AppDatabase{
return instance?: synchronized(this){
instance ?: buildDatabase(context).also{ instance = it }
}
}
private fun buildDatabase(context: Context):AppDatabase{
return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.addCallback(
object : Callback(){
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
val request = OneTimeWorkRequestBuilder<SeedDatabaseWorker>().setInputData(
workDataOf(KEY_FILENAME to PLANT_DATA_FILENAME)).build()
WorkManager.getInstance(context).enqueue(request)
}
}
).build()
}
}
}
const val DATABASE_NAME = "sunflower-db"
const val PLANT_DATA_FILENAME = "plants.json"
class SeedDatabaseWorker(context: Context, workerParams: WorkerParameters):CoroutineWorker(context, workerParams) {
companion object{
private const val TAG = "SeedDatabaseWorker"
const val KEY_FILENAME = "PLANT_DATA_FILENAME"
}
override suspend fun doWork(): Result = withContext(Dispatchers.IO){
try {
val filename = inputData.getString(KEY_FILENAME)
if(filename != null){
applicationContext.assets.open(filename).use { inputStream ->
JsonReader(inputStream.reader()).use { jsonReader ->
val plantType = object : TypeToken<List<Plant>>() {}.type
val plantList: List<Plant> = Gson().fromJson(jsonReader, plantType)
val database = AppDatabase.getInstance(applicationContext)
database.plantDao().insertAll(plantList)
Result.success()
}
}
}else{
Log.e(TAG, "Error seeding database - no valid filename")
Result.failure()
}
}catch (ex:Exception){
Log.e(TAG, "Error seeding database", ex)
Result.failure()
}
}
}
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
found in modules annotations-12.0 (com.intellij:annotations:12.0) and annotations-13.0 (org.jetbrains:annotations:13.0)
configurations {
implementation {
exclude(group = "org.jetbrains", module = "annotations")
}
}
의심부는 찾았으니 해결은 다음에 이어서 하도록 하자