繁体   English   中英

尽管数据存在,RecyclerView 不会更新 ROOM 数据库

[英]RecyclerView does not update ROOM Database although data exists

我的Entity class 看起来像这样:

@Entity
public class User {

    public int getId() {
        return id;
    }

    @NonNull
    public ArrayList<String> getValues(){
        return values;
    }

    @NonNull
    public ArrayList<String> getDates(){
        return dates;
    }

    @NonNull
    public String getType_counter() {
        return type_counter;
    }

    @NonNull
    public String getWhere_counter() {
        return where_counter;
    }

    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "d")
    @TypeConverters({Converters.class})
    public ArrayList<String> dates;

    @ColumnInfo(name = "value")
    @TypeConverters({Converters.class})
    public ArrayList<String> values;

    @ColumnInfo(name = "type")
    public String type_counter;

    @ColumnInfo(name = "location")
    public String where_counter;
}

我有一个仅显示类型和位置的 RecyclerView,当您单击任何项​​目时,它会转到另一个活动,其中另一个 RecyclerView 将这个特定用户(按 Id)的值和日期显示为 arrays。

我的问题是:我的应用程序的用户可以创建新User object 或update它(将值和日期添加到 ArrayLists),并且在更新 RecyclerView 时无法正常工作。

假设我有两个User对象,我的数据库如下所示:

在此处输入图像描述

我的拳头 object 有两个值和日期,但 RecyclerView 只显示一个。

在此处输入图像描述

当我向第二个User object 添加另一个值和日期时,RecyclerView 显示两个对象中的两个元素。

这就是我更新值的方式:

private void saveNewValue(String value, String type, String location){

        // Getting current date
        Date c = Calendar.getInstance().getTime();
        SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault());
        String formattedDate = df.format(c);

        userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);

        // checking if the counter exists
        int mList = userViewModel.setTypeLocation(type, location);

        if (mList == 0){
            //Saving new User
            User user = new User();

            if (user.values == null){
                user.values = new ArrayList<String>();
            }
            if (user.dates == null){
                user.dates = new ArrayList<String>();
            }
            user.values.add(value);
            user.dates.add(formattedDate);
            user.type_counter = type;
            user.where_counter = location;

            userViewModel.insert(user);
            Toast.makeText(this, "Successfully saved!", Toast.LENGTH_SHORT).show();
        }
        else {
            //Getting current data
            User mUser = userViewModel.getUserWithLocationType(type, location);
            ArrayList<String> values_user = mUser.getValues();
            ArrayList<String> dates_user = mUser.getDates();

            // Updating arrays
            values_user.add(value);
            dates_user.add(formattedDate);

            // Creating new User object with updated values
            User updatedUser = new User();
            updatedUser.id = mUser.getId();
            updatedUser.type_counter = type;
            updatedUser.where_counter = location;
            updatedUser.values = values_user;
            updatedUser.dates = dates_user;

            userViewModel.update(updatedUser);
            //userAdapter.notifyItemChanged();

            Toast.makeText(this, "Successfully updated!", Toast.LENGTH_SHORT).show();

        }
    }

这是已描述RecyclerViewAdapter class :

public class CalculationAdapter extends RecyclerView.Adapter<CalculationAdapter.CalcViewHolder>{

    private LayoutInflater inflater;
    private Context mContext;
    private ArrayList<String> mValues;
    private ArrayList<String> mDates;
    private User mUser;

    public CalculationAdapter(Context ctx){
        inflater = LayoutInflater.from(ctx);
        mContext = ctx;
    }

    public void setUser(User user){
        mUser = user;
        mValues = user.getValues();
        mDates = user.getDates();
        notifyDataSetChanged();
        Log.i("values", String.valueOf(mValues));
        Log.i("dates", String.valueOf(mDates));
    }

    @NonNull
    @Override
    public CalculationAdapter.CalcViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.calculations_item, parent, false);
        CalculationAdapter.CalcViewHolder holder = new CalculationAdapter.CalcViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull CalculationAdapter.CalcViewHolder holder, int position) {
        if (mValues != null & mDates != null){
            String value = mValues.get(position);
            String date = mDates.get(position);
            holder.setValuesDates(value, date, position);
        }
        else{
            holder.mValue.setText("No value");
            holder.mDate.setText("No date");
        }
    }

    @Override
    public int getItemCount() {
        if (mValues != null){
            return mValues.size();
        } else return 0;
    }

    class CalcViewHolder extends RecyclerView.ViewHolder {

        private TextView mValue;
        private TextView mDate;
        private int mPosition;

        public CalcViewHolder(@NonNull View itemView) {
            super(itemView);

            mValue = itemView.findViewById(R.id.item_value);
            mDate = itemView.findViewById(R.id.item_date);

        }

        public void setValuesDates(String value, String date, int position){
            mValue.setText(value);
            mDate.setText(date);
            mPosition = position;
        }
    }

}

这是 ViewModel class:

public class UserViewModel extends AndroidViewModel {

    private String TAG = this.getClass().getSimpleName();
    private UserDao userDao;
    private AppDatabase appDatabase;
    private LiveData<List<User>> mAllUsers;
    private LiveData<String[]> mAllLocations;
    private LiveData<User> mUser;
    private int UserLocationTypeExists;

    public UserViewModel(@NonNull Application application) {
        super(application);

        appDatabase = AppDatabase.getInstance(application);
        userDao = appDatabase.userDao();
        mAllUsers = userDao.getAllValues();
        mAllLocations = userDao.getAllLocations();
    }

    public void setId(int id){
        mUser = userDao.getUserWithId(id);
    }

    public User getUserWithLocationType(String type, String location){
        return userDao.getUserwithLocationType(type, location);
    }

    public int setTypeLocation(String type, String location){
        UserLocationTypeExists = userDao.UserWithTypeLocationExists(type, location);
        return UserLocationTypeExists;
    }

    public void update(User user) {
        new UpdateAsyncTask(userDao).execute(user);
    }

    public void insert(User user){
        new InsertAsyncTask(userDao).execute(user);
    }

    public void delete(User user){
        new DeleteAsyncTask(userDao).execute(user);
    }

    public LiveData<List<User>> getAllUsers(){
        return mAllUsers;
    }

    public LiveData<String[]> getAllLocations() {
        return mAllLocations;
    }

    public LiveData<User> getUserAtId(){
        return mUser;
    }

    private class InsertAsyncTask extends AsyncTask<User, Void, Void> {

        UserDao userDao;

        public InsertAsyncTask(UserDao userDao) {
            this.userDao = userDao;
        }

        @Override
        protected Void doInBackground(User... users) {
            userDao.insertValue(users[0]);
            return null;
        }
    }

    private class DeleteAsyncTask extends AsyncTask<User, Void, Void> {

        UserDao userDao;

        public DeleteAsyncTask(UserDao userDao) {
            this.userDao = userDao;
        }

        @Override
        protected Void doInBackground(User... users) {
            userDao.deleteValue(users[0]);
            return null;
        }
    }

    private class UpdateAsyncTask extends AsyncTask<User, Void, Void> {

        UserDao userDao;

        public UpdateAsyncTask(UserDao userDao) {
            this.userDao = userDao;
        }

        @Override
        protected Void doInBackground(User... users) {
            userDao.update(users[0]);
            return null;
        }
    }
}

这是我有RecyclerViewActivity

public class CalculationActivity extends AppCompatActivity{

    private int id_counter;
    private UserViewModel userViewModel;
    private CalculationAdapter calcAdapter;
    private int rate;
    private String value1, date1, value2, date2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculation);

        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            id_counter = extras.getInt("id");
        }

        RecyclerView recyclerView = findViewById(R.id.recyclerView_calc);
        calcAdapter = new CalculationAdapter(this);
        recyclerView.setAdapter(calcAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);

        userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
        userViewModel.setId(id_counter);
        userViewModel.getUserAtId().observe(this, new Observer<User>() {
            @Override
            public void onChanged(User user) {
                calcAdapter.setUser(user);
            }
        });
    }
}

有人可以帮我弄清楚为什么我的 RecyclerView 不能正确更新数据吗? 提前致谢。

如有必要,我可以添加更多信息。

这是TypeConverters.class

public class Converters {
    @TypeConverter
    public static ArrayList<String> fromString(String value) {
        Type listType = new TypeToken<ArrayList<String>>() {}.getType();
        return new Gson().fromJson(value, listType);
    }

    @TypeConverter
    public static String fromArrayList(ArrayList<String> list) {
        Gson gson = new Gson();
        return gson.toJson(list);
    }
}

编辑:我在数据库中保存了不同的值。 这是数据库的外观:

在此处输入图像描述

这是Activity1

在此处输入图像描述

当我单击这两个项目时,它们都显示值2222

在此处输入图像描述

SetUser方法的 Output (当我单击每个项目时):

I/values: [2222]
I/dates: [27-Juli-2022]

I/values: [2222]
I/dates: [27-Juli-2022]

小错误...我一直以错误的方式向 Activity2 发送 ID。 我一直在遍历所有元素的onBindViewHolder方法中得到它,这就是为什么我只从最后保存的元素中获得值的原因。 我需要在OnClick方法中的Holder class 中获取 ID。 无论如何,感谢您的所有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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