![](/img/trans.png)
[英]Room migration that only adds a @NonNull annotation to primary key on several tables
[英]Room Insert only inserts the primary key and not columns
我试图将一个对象插入到房间数据库中,但是似乎只插入了主键。 当我尝试访问其他字符串列表和整数列表时,它们都为null。
实体
@Entity
public class DayMenu{
@PrimaryKey @NonNull
private String dayDate;
@TypeConverters(IntegerConverter.class)
private List<Integer> dayRecipesID;
@TypeConverters(StringConverter.class)
private List<String> dayRecipesTitle;
道
@Dao
public interface DayMenuDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertDayMenu(DayMenu dayMenu);
@Query("select * from DayMenu")
List<DayMenu> getAll();
@Query("select * from DayMenu")
LiveData<List<DayMenu>> getAllLD();
@Query("select dayDate from DayMenu where DayMenu.dayDate = :day_date")
DayMenu getFromDate(String day_date);
}
当我查看dayMenu(如下)时,在将其插入之前,它将具有两个具有正确数据的列表。 但是,当我调用getAll(),getAllLD()或getFromDate()时,该信息未插入或未恢复。
主要活动
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (etDate.getText().length() != 0) {
String currentDate = etDate.getText().toString();
DayMenu dayMenu = new DayMenu();
dayMenu.setDayDate(currentDate);
List<Integer> recIDs = new ArrayList<>();
List<String> recTits = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int childCount = linearLayoutParent.getChildCount();
if (childCount > 1) {
for (int i = 0; i < childCount - 1; i++) {
View linearLayoutChild = linearLayoutParent.getChildAt(i);
ViewGroup lLC = (ViewGroup) linearLayoutChild;
Button recipeButton = (Button) lLC.getChildAt(0);
recIDs.add(Integer.parseInt(recipeButton.getTag().toString()));
recTits.add(recipeButton.getText().toString());
}
dayMenu.setDayRecipesID(recIDs);
dayMenu.setDayRecipesTitle(recTits);
for(String str : dayMenu.getDayRecipesTitle()){
sb.append(str).append(", ");
}
new AsyncIns(mViewModel.GetDayMenuDao(),dayMenu).execute();
Toast.makeText(_context, sb,Toast.LENGTH_SHORT).show();
}
else{
NoRecipesAddedHandler(_context);
}
}
else{
NoDateSelectedHandler(_context);
}
}
});
异步任务
private class AsyncIns extends AsyncTask<Void, Void, DayMenu>{
final DayMenuDao mDao;
final DayMenu mDM;
AsyncIns(DayMenuDao dao, DayMenu dm){
mDao = dao;
mDM = dm;
}
@Override
protected DayMenu doInBackground(Void... params){
mDao.insertDayMenu(mDM);
return mDao.getFromDate(mDM.getDayDate());
}
@Override
protected void onPostExecute(DayMenu d){
Toast.makeText(_context,d.getDayDate(),Toast.LENGTH_LONG).show();
}
}
这将显示保存到数据库的日期,并且我已经能够使用其他方法查看日期。 但是,当我尝试访问配方ID和标题时,列表为空。
我不太确定出什么问题了,好像insertDayMenu只是插入实体主键。
您可以使用Stetho库查看数据库中实际包含的内容:
将此行添加到您的build.gradule模块文件中:
implementation 'com.facebook.stetho:stetho:1.5.0'
然后添加一个Application.java文件,如下所示:
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
Context context = getBaseContext();
Stetho.initializeWithDefaults(this);
}
}
然后添加清单文件:在应用程序标签中添加:
android:name="MyApplication"
当您的应用程序运行时,打开google chrome,然后输入:
chrome://inspect/#devices
您应该看到您的应用程序-对其进行检查,您将看到数据库中的内容
我也刚刚注意到您使用驼峰命名法,这对Java很好,但对数据库却不好:
您的代码需要看起来像这样:
@TypeConverters(IntegerConverter.class)
@SerializedName("day_recipes_id")
@Expose
private List<Integer> dayRecipesID;
@TypeConverters(StringConverter.class)
@SerializedName("day_recipes_title")
@Expose
private List<Integer> dayRecipesTitle;
SQLite不能具有数据类型List <>。 也许您想要这些领域的一对多关系? 一个DayMenu可以有多个DayRecipes。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.