実現したいこと
Room を使用して、データベースに LocalDateTime 型を保存したいです。
Converter を使用するとの記載を見つけてやってみたのですが、
https://developer.android.com/training/data-storage/room/referencing-data?hl=ja
以下のエラーが出て、実現できませんでした。
何が間違えているのか詰まってしまっているため、アドバイスをいただけませんでしょうか?
また、もし知っていれば、スキーマを書き換えたときに
バージョンを上げるなどの処理をしなければならないと思うのですが、
その処理を実施しなくてもいい方法がもしあれば教えていただけませんでしょうか。
この辺のこと↓です。
https://qiita.com/kazuma_f/items/8c15e7087623e8f6706b
ご回答をいただけますととても嬉しいです。
どうぞよろしくお願いいたします。
発生している問題・エラーメッセージ
FATAL EXCEPTION: Thread-2 Process: com.example.RecordTime, PID: 13832 java.lang.IllegalArgumentException: Unexpected type converter com.example.RecordTime.Rooms.Converters@8399701. Annotate TypeConverter class with @ProvidedTypeConverter annotation or remove this converter from the builder. at androidx.room.RoomDatabase.init(RoomDatabase.kt:284) at androidx.room.RoomDatabase$Builder.build(RoomDatabase.kt:1352) at com.example.RecordTime.DateFragment$ConnectDB.run(DateFragment.java:90) at java.lang.Thread.run(Thread.java:1012)
該当のソースコード
DateFragment.java
1public class DateFragment extends Fragment { 2 3 Adapter adapter = new Adapter(); 4 5 TimeTableDao timeTableDao; 6 7 List<TimeTableEntity> timeTableEntities = new ArrayList<>(); 8 9 View view; 10 11 int year; 12 int month; 13 int date; 14 15 @Override 16 public void onCreate(@Nullable Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 19 new Thread(new ConnectDB()).start(); 20 21 getParentFragmentManager().setFragmentResultListener("date", this, new FragmentResultListener() { 22 23 @Override 24 public void onFragmentResult(@NonNull String key, @NonNull Bundle bundle) { 25 year = bundle.getInt("year"); 26 month = bundle.getInt("month"); 27 date = bundle.getInt("date"); 28 29 // 〇年・〇月・〇日をセット 30 setDateText(); 31 } 32 }); 33 } 34 35 @Override 36 public View onCreateView(LayoutInflater inflater, ViewGroup container, 37 Bundle savedInstanceState) { 38 // Inflate the layout for this fragment 39 return inflater.inflate(R.layout.date_fragment, container, false); 40 } 41 42 @Override 43 public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { 44 45 this.view = view; 46 47 new Thread(new SelectRec()).start(); 48 49 // RecyclerView をセット 50 RecyclerView recyclerView = view.findViewById(R.id.time_table_recycler_view); 51 recyclerView.setHasFixedSize(true); 52 recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 53 recyclerView.setAdapter(adapter); 54 } 55 56 class ConnectDB implements Runnable { 57 @Override 58 public void run() { 59 AppDatabase database = Room.databaseBuilder(getActivity().getApplicationContext(), 60 AppDatabase.class, "TimeTable") 61 .addTypeConverter(new Converters()) 62 .build(); 63 timeTableDao = database.timeTableDao(); 64 } 65 } 66 67 class SelectRec implements Runnable { 68 @Override 69 public void run() { 70 timeTableDao.insert(new TimeTableEntity("time1")); 71 timeTableDao.insert(new TimeTableEntity("time2")); 72 timeTableEntities = timeTableDao.getAll(); 73 Log.d("================>", timeTableEntities.get(0).title); 74 } 75 } 76 77 public void setDateText() { 78 79 // 〇年をセット 80 TextView year_text = view.findViewById(R.id.selected_year); 81 year_text.setText(year + " 年"); 82 83 // 〇月をセット 84 TextView month_text = view.findViewById(R.id.selected_month); 85 month_text.setText(month + " 月"); 86 87 // 〇日をセット 88 TextView date_text = view.findViewById(R.id.selected_date); 89 date_text.setText(date + " 日"); 90 } 91 92 class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> { 93 94 public class ViewHolder extends RecyclerView.ViewHolder { 95 96 TextView textView; 97 98 public ViewHolder(@NonNull View itemView) { 99 super(itemView); 100 101 this.textView = itemView.findViewById(R.id.time_table_view_holder); 102 } 103 } 104 105 @NonNull 106 @Override 107 public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 108 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.time_table_viewholder, parent, false); 109 return new ViewHolder(view); 110 } 111 112 @Override 113 public void onBindViewHolder(@NonNull ViewHolder holder, int position) { 114// holder.textView.setText(timeTableRoomEntities.get(position).title); 115 } 116 117 118 @Override 119 public int getItemCount() { 120 return 0; 121 } 122 } 123}
Converters.java
1@ProvidedTypeConverter 2public class Converters { 3 4 @TypeConverter 5 public static LocalDateTime toLocalDateTime(String val) { 6 return LocalDateTime.parse(val); 7 } 8 9 @TypeConverter 10 public static String fromLocalDateTime(LocalDateTime val) { 11 return val.toString(); 12 } 13}
AppDatabase.java
1@Database(entities = {TimeTableEntity.class}, version = 1) 2@TypeConverters(Converters.class) 3public abstract class AppDatabase extends RoomDatabase { 4 public abstract TimeTableDao timeTableDao(); 5}
TimeTableDao.java
1@Dao 2public interface TimeTableDao { 3 4 @Insert 5 void insert(TimeTableEntity timeTableEntity); 6 7 @Query("SELECT * FROM TimeTable") 8 List<TimeTableEntity> getAll(); 9}
TimeTableEntity.java
1@Entity(tableName = "TimeTable") 2public class TimeTableEntity { 3 4 @PrimaryKey 5 public int id; 6 7 @ColumnInfo(name = "dateTime") 8 public LocalDateTime dateTime; 9 10 @ColumnInfo(name = "title") 11 public String title; 12 13 public TimeTableEntity(String title) { 14 this.dateTime = LocalDateTime.parse(title); 15 } 16}
time_table_viewholder.xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <TextView 7 android:id="@+id/time_table_view_holder" 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:layout_weight="1" 11 android:ems="10" 12 android:text="@string/time_view_holder" /> 13 14</LinearLayout>
回答1件
あなたの回答
tips
プレビュー