繁体   English   中英

无法使用 RecylerView Android 从 RoomDatabase 检索数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM