[英]Cannot retrieve data from RoomDatabase using RecylerView Android
我正在尝试使用 recylerView 显示来自房间数据库的数据。 我可以看到数据在房间数据库的表中,但我无法使用 recylerView 显示。 请检查我的代码,让我知道我错在哪里。 非常感谢。
下面是我的实体类
@Entity(tableName = "myExpense")
public class Expense {
@PrimaryKey(autoGenerate = true)
public int uid;
@ColumnInfo(name = "Amount")
public String amount;
@ColumnInfo(name = "Date")
@TypeConverters({Converters.class})
public Date date;
@ColumnInfo(name = "ExpenseType")
public String expenseType;
@ColumnInfo(name = "PaymentType")
public String paymentType;
public Expense(int uid, String amount, Date date, String expenseType, String paymentType) {
this.uid = uid;
this.amount = amount;
this.date = date;
this.expenseType = expenseType;
this.paymentType = paymentType;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getExpenseType() {
return expenseType;
}
public void setExpenseType(String expenseType) {
this.expenseType = expenseType;
}
public String getPaymentType() {
return paymentType;
}
public void setPaymentType(String paymentType) {
this.paymentType = paymentType;
}
}
这是我的道课
@Dao
public interface ExpenseDao {
@Insert
void insertExpense(Expense expense);
@Query( "SELECT *FROM myExpense" )
List<Expense> getAllExpenses();
@Query("SELECT SUM (Amount) From myExpense")
float getAllExpenseSum();
}
下面是我的适配器类
public class ExpenseAdapter extends RecyclerView.Adapter<ExpenseAdapter.myViewHolder> {
List<Expense> ExpenseList;
Context context;
public ExpenseAdapter(Context context,List<Expense> ExpenseList)
{
this.context=context;
this.ExpenseList=ExpenseList;
}
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from ( parent.getContext () ).inflate ( R.layout.expense_adapter, parent, false );
return new myViewHolder ( view );
}
@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position)
{
Date date = ExpenseList.get ( position ).getDate ();
DateFormat dateFormat = new SimpleDateFormat ( "dd-MM-yyyy HH:mm", Locale.UK );
String stringDate = dateFormat.format ( date );
holder.ExpenseAmountTxt.setText ( ExpenseList.get (position).getAmount () );
holder.ExpenseTypeTxt.setText ( ExpenseList.get ( position ).getExpenseType () );
holder.PaymentTypeTxt.setText ( ExpenseList.get ( position ).getPaymentType () );
holder.ExpenseDateTxt.setText ( stringDate );
String ExpenseType=(String) holder.ExpenseTypeTxt.getText ();
if (ExpenseType.equals ( "Oil" ))
{
holder.ExpenseIcon.setImageResource ( R.drawable.petrol_icon );
}
else if (ExpenseType.equals ( "Maintainance" ))
{
holder.ExpenseIcon.setImageResource ( R.drawable.maintenance );
}
else if (ExpenseType.equals ( "Food" ))
{
holder.ExpenseIcon.setImageResource ( R.drawable.food );
}
else if (ExpenseType.equals ( "Other" ))
{
holder.ExpenseIcon.setImageResource ( R.drawable.othersicon );
}
}
@Override
public int getItemCount() {
return ExpenseList.size ();
}
public class myViewHolder extends RecyclerView.ViewHolder {
TextView ExpenseAmountTxt,ExpenseTypeTxt,PaymentTypeTxt,ExpenseDateTxt;
ImageView ExpenseIcon;
public myViewHolder(@NonNull View itemView) {
super ( itemView );
ExpenseAmountTxt= itemView.findViewById ( R.id.ExpensetxtViewAmount );
ExpenseTypeTxt= itemView.findViewById ( R.id.ExpenseType);
PaymentTypeTxt= itemView.findViewById ( R.id.ExpenseAmountType );
ExpenseDateTxt= itemView.findViewById ( R.id.ExpensedateText );
}
}
}
这就是我试图展示的方式
public class Income_Expense extends Fragment {
BottomBar bottomBar;
RoomAdapter roomAdapter;
ExpenseAdapter expenseAdapter;
RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view= inflater.inflate ( R.layout.income_expense, container, false );
bottomBar= view.findViewById ( R.id.bottomBar );
recyclerView= view.findViewById ( R.id.myrecView2 );
recyclerView.setLayoutManager ( new LinearLayoutManager (getContext () ) );
bottomBar.setOnTabSelectListener ( new OnTabSelectListener () {
@Override
public void onTabSelected(int tabId) {
if (tabId==R.id.Expenses)
{
AppDatabase db = Room.databaseBuilder ( getContext (), AppDatabase.class, "myexpense" ).allowMainThreadQueries ().build ();
ExpenseDao expenseDao = db.expenseDao ();
List<Expense> expenses= expenseDao.getAllExpenses ();
expenseAdapter = new ExpenseAdapter ( getContext (), expenses );
recyclerView.setAdapter ( expenseAdapter );
expenseAdapter.notifyDataSetChanged ();
}
}
} );
return view;
}
}
最后一课是appDatabase
@Database(entities = {Income.class,Expense.class}, version =
2,exportSchema = false)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
public abstract ExpenseDao expenseDao();}
谢谢你的时间。 我真的被这个任务困在这里。 再次感谢
bottomBar.setOnTabSelectListener ( new OnTabSelectListener () {
@Override
public void onTabSelected(int tabId) {
if (tabId==R.id.Expenses)
{
AppDatabase db = Room.databaseBuilder ( getContext (), AppDatabase.class, "myexpense" ).allowMainThreadQueries ().build ();
ExpenseDao expenseDao = db.expenseDao ();
List<Expense> expenses= expenseDao.getAllExpenses ();
expenseAdapter = new ExpenseAdapter ( getContext (), expenses );
recyclerView.setAdapter ( expenseAdapter );
expenseAdapter.notifyDataSetChanged ();
}
}
} );
不是 myexpense ->myExpense 这个正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.