実現したいこと
androidstudioでアンドロイドアプリを開発しており、毎日0時になると自動的に日付レコードを追加する処理を開発しています。
発生している問題・分からないこと
SQLiteでは日付型がないので試行錯誤しており、現状はStringで入力しようと思っていますが、Daoがエラーとなっています。
エラーメッセージ
error
1db\DrinkingRecordDao.java:11: エラー: Type of the parameter must be a class annotated with @Entity or a collection/array of it. 2 kotlin.coroutines.Continuation<? super java.lang.Long> $completion); 3db\DrinkingRecordDao.java:9: エラー: Not sure how to handle insert method's return type. 4 public abstract java.lang.Object insert(@org.jetbrains.annotations.NotNull() 5 6 7<daoに出力しているエラー> 8package com.example.app.data.db; 9 10@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\t\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\bg\u0018\u00002\u00020\u0001J\u0016\u0010\u0002\u001a\u00020\u00032\u0006\u0010\u0004\u001a\u00020\u0005H\u00a7@\u00a2\u0006\u0002\u0010\u0006\u00a8\u0006\u0007"}, d2 = {"Lcom/example/app/data/db/DrinkingRecordDao;", "", "insert", "", "record", "Lcom/example/app/data/model/DrinkingRecord;", "(Lcom/example/app/data/model/DrinkingRecord;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "app_debug"}) 11@androidx.room.Dao() 12public abstract interface DrinkingRecordDao { 13 14 @androidx.room.Insert() 15 @org.jetbrains.annotations.Nullable() 16 public abstract java.lang.Object insert(@org.jetbrains.annotations.NotNull() 17 com.example.app.data.model.DrinkingRecord record, @org.jetbrains.annotations.NotNull() 18 kotlin.coroutines.Continuation<? super java.lang.Long> $completion); 19}
該当のソースコード
Dao
1package com.example.app.data.db 2 3import androidx.room.Dao 4import androidx.room.Insert 5import androidx.room.Query 6import com.example.app.data.model.DrinkingRecord 7import java.util.Date 8import com.example.app.data.db.AppDatabase 9import java.time.Instant 10 11@Dao 12interface DrinkingRecordDao { 13 @Insert 14 suspend fun insert(record : DrinkingRecord): Long 15} 16
AppDatabase
1package com.example.app.data.db 2 3import androidx.room.Database 4import androidx.room.RoomDatabase 5import androidx.room.TypeConverters 6import com.example.app.data.db.LocalDateConverter 7import com.example.app.data.db.DrinkingRecordDao 8import com.example.app.data.model.DrinkingRecord 9 10 11@Database(entities = [DrinkingRecord::class], version = 1,exportSchema = false) 12@TypeConverters(LocalDateConverter::class) 13abstract class AppDatabase : RoomDatabase() { 14 abstract fun drinkingRecordDao(): DrinkingRecordDao 15} 16
Entity
1package com.example.app.data.model 2 3import androidx.room.ColumnInfo 4import androidx.room.Entity 5import androidx.room.PrimaryKey 6import java.time.Instant 7import java.util.Date 8 9@Entity(tableName = "drinking_record") 10data class DrinkingRecord( 11 @PrimaryKey @ColumnInfo(name = "date") val date: String, // 日付をプライマリーキーとして定義 12 @ColumnInfo(name = "drinking_flag") val drinkingFlag: Boolean, // 飲酒フラグ 13 @ColumnInfo(name = "home") val home: Boolean, // 家 14 @ColumnInfo(name = "eating_out") val Eatingout: Boolean, // // 場所 15 @ColumnInfo(name = "money") val money: Int, // 金額 16 @ColumnInfo(name = "alc_amount") val alcamount: Int // アルコール量 17)
Converter
1package com.example.app.data.db 2 3import androidx.room.Dao 4import androidx.room.Insert 5import androidx.room.Query 6import androidx.room.TypeConverter 7import com.example.app.data.model.DrinkingRecord 8import java.time.Instant 9import java.time.LocalDate 10import java.time.ZoneOffset 11import java.time.format.DateTimeFormatter 12import java.time.format.DateTimeFormatterBuilder 13import java.time.format.SignStyle 14import java.time.temporal.ChronoField 15import java.util.Date 16 17class LocalDateConverter { 18 @TypeConverter 19 fun fromLocalDate(localDate: LocalDate): String { 20 return localDate.toString() 21 } 22 23 @TypeConverter 24 fun toLocalDate(stringDate: String): LocalDate { 25 return LocalDate.parse(stringDate) 26 } 27}
override suspend fun doWork(): Result { return withContext(Dispatchers.IO) { try { val database = DatabaseProvider.getDatabase(applicationContext) val drinkingRecordDao = database.drinkingRecordDao() val currentDate = SimpleDateFormat("yyyyMMdd", Locale.getDefault()).format(Date()) val record = DrinkingRecord( date = currentDate, drinkingFlag = false, home = false, Eatingout = false, money = 0, alcamount = 0 ) drinkingRecordDao.insert(record) Result.success() } catch (e: Exception) { Result.failure() } } } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
AI等で確認しましたが、EntityとDao内の処理が異なるとの回答になります。
日付生成レコードではEntity通りに型を入れているつもりなので、手詰まりになってしまっていました。
補足
特になし
あなたの回答
tips
プレビュー