Сортировка не работает в области базы данных в моем приложении

1

Я новичок в области БД. Я закончил добавить и получить данные в области БД. Но я не смог отсортировать (по возрастанию и по убыванию). Мой код отображает элементы в виде списка. Список содержит 5 списков, и каждый список содержит 4 поля (имя, возраст, навык и дата). если я сортирую (по возрастанию) имя, нужно по возрастанию в 5 списке. Мой код не работает, я публикую свой код здесь,

 private void Ascending_order() {

    realm.beginTransaction();


  RealmResults<Employee> result = realm.where(Employee.class)
            .sort("name", Sort.ASCENDING).findAll();
    realm.copyFromRealm(result);
    realm.commitTransaction();
    employeedetailadapter.notifyDataSetChanged();
}

Класс адаптера:

  public class EmployeeDetailAdapter extends BaseAdapter {

private ArrayList<Employee>employeeDetaillists = new ArrayList<>();
private Context c;
private LayoutInflater inflater;
private OnItemClick mCallback;
private SimpleDateFormat df = new SimpleDateFormat("dd/mm/yyyy");



public EmployeeDetailAdapter(Context c,ArrayList<Employee> employeeDetaillists, OnItemClick listener) {
    this.employeeDetaillists = employeeDetaillists;
this.c= c;
    inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.mCallback = listener;

}

@Override
public int getCount() {
    return employeeDetaillists.size();
}

@Override
public Object getItem(int position) {
    return employeeDetaillists.get(position);
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View v = convertView;
Holder holder;

if (v==null){
    v= (View) inflater.inflate(R.layout.list_single_item,null);
    holder = new Holder();
    holder.tvPersonName = (TextView) v.findViewById(R.id.tvPersonName);
    holder.tvPersonAge = (TextView) v.findViewById(R.id.tvPersonAge);
    holder.tvPersonSkill = (TextView) v.findViewById(R.id.tvPersonSkill);
    holder.ivEditPesonDetail=(ImageView)v.findViewById(R.id.ivEditPesonDetail);
    holder.tvPersondate=(TextView)v.findViewById(R.id.tvPersondate);
    holder.ivDeletePerson=(ImageView)v.findViewById(R.id.ivDeletePerson);
    v.setTag(holder);
}else{
    holder = (Holder) v.getTag();
}
holder.tvPersonName.setText(employeeDetaillists.get(position).getName());
holder.tvPersonAge.setText(employeeDetaillists.get(position).getAge());
holder.tvPersonSkill.setText(employeeDetaillists.get(position).getSkill());
    String strDate = df.format(employeeDetaillists.get(position).getSdate());
holder.tvPersondate.setText(strDate);

holder.ivDeletePerson.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Delete(employeeDetaillists.get(position).getName(),position);

    }
});

return v;
}

private void Delete(String name, int position) {
    mCallback.onClickdelete(name, position);
}

public void updateData(RealmResults<Employee> result) {

}


class Holder {
    TextView tvPersonName, tvPersonAge, tvPersonSkill,tvPersondate;
    ImageView ivDeletePerson, ivEditPesonDetail;
}

}

Теги:
realm
realm-database
realm-mobile-platform

3 ответа

0

Прежде всего, при получении данных из Realm вам не нужно записывать их в транзакции. Запись транзакции требуется только при добавлении данных в область или обновлении любого объекта области.

И о вашей проблеме, чтобы получить отсортированные данные из области, вы можете сделать это следующим образом

RealmResults<Employee> result = realm.where(Employee.class).sort("name", Sort.ASCENDING).findAll();

Теперь данные, которые вы получили, отсортированы. Если вы по-прежнему видите неправильный порядок в вашем ListView, возможно, в вашем адаптере возникла проблема. Если вы поделитесь своим кодом адаптера, то я могу помочь дальше :)

Обновлено:

Класс адаптера

  public class EmployeeDetailAdapter extends BaseAdapter {

    private RealmResults<Employee> employeeDetaillists;
    private Context c;
    private LayoutInflater inflater;
    private OnItemClick mCallback;
    private SimpleDateFormat df = new SimpleDateFormat("dd/mm/yyyy");



    public EmployeeDetailAdapter(Context c,RealmResults<Employee> employeeDetaillists, OnItemClick listener) {
        this.employeeDetaillists = employeeDetaillists;
        this.c= c;
        inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.mCallback = listener;

    }

    @Override
    public int getCount() {
        return employeeDetaillists.size();
    }

    @Override
    public Object getItem(int position) {
        return employeeDetaillists.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        Holder holder;

        if (v==null){
            v= (View) inflater.inflate(R.layout.list_single_item,null);
            holder = new Holder();
            holder.tvPersonName = (TextView) v.findViewById(R.id.tvPersonName);
            holder.tvPersonAge = (TextView) v.findViewById(R.id.tvPersonAge);
            holder.tvPersonSkill = (TextView) v.findViewById(R.id.tvPersonSkill);
            holder.ivEditPesonDetail=(ImageView)v.findViewById(R.id.ivEditPesonDetail);
            holder.tvPersondate=(TextView)v.findViewById(R.id.tvPersondate);
            holder.ivDeletePerson=(ImageView)v.findViewById(R.id.ivDeletePerson);
            v.setTag(holder);
        }else{
            holder = (Holder) v.getTag();
        }
        holder.tvPersonName.setText(employeeDetaillists.get(position).getName());
        holder.tvPersonAge.setText(employeeDetaillists.get(position).getAge());
        holder.tvPersonSkill.setText(employeeDetaillists.get(position).getSkill());
        String strDate = df.format(employeeDetaillists.get(position).getSdate());
        holder.tvPersondate.setText(strDate);

        holder.ivDeletePerson.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Delete(employeeDetaillists.get(position).getName(),position);

            }
        });

        return v;
    }

    private void Delete(String name, int position) {
        mCallback.onClickdelete(name, position);
    }

    public void updateData(RealmResults<Employee> result) {

    }


    class Holder {
        TextView tvPersonName, tvPersonAge, tvPersonSkill,tvPersondate;
        ImageView ivDeletePerson, ivEditPesonDetail;
    }
}

В вашей деятельности, пожалуйста, измените следующую функцию

 private void Ascending_order() {
      result = realm.where(Employee.class)
           .sort("name", Sort.ASCENDING).findAll();
     employeedetailadapter.notifyDataSetChanged();
  }

Список "result" должен быть объявлен на уровне класса и также должен быть передан конструктору Adapter.

подобно

    class Activity {
      RealmResults<Employee> result;
      EmployeeDetailAdapter employeedetailadapter;

      //// Other Code

        public onCreate(Bundle b) {
         result = realm.where(Employee.class).findAll();
               employeedetailadapter = new EmployeeDetailAdapter(this, result, listener);

          // Other code
         }
   }
  • 0
    Я загружаю свой класс адаптера. Можете ли вы проверить и обновить меня?
  • 0
    Измените ArrayList на RealmResults в вашем адаптере везде. Я обновил свой ответ.
Показать ещё 1 комментарий
0

Ваш код не меняет БД. Вы просто получаете отсортированные предметы, но не используете их.

realm.copyFromRealm(result); // this line does nothing
realm.commitTransaction(); // this one too, because you change nothing
employeedetailadapter.notifyDataSetChanged(); // you data is the same, so this line also useless here

Для просмотра отсортированных данных вы должны использовать RealmResults в вашем адаптере. При таком подходе ваш список всегда будет отсортирован, даже после добавления новых элементов. Но обратите внимание: ваш адаптер должен RealmRecyclerViewAdapter.

Вы должны запустить этот код перед созданием адаптера и использовать result внутри адаптера:

RealmResults<Employee> result = realm.where(Employee.class)
        .sort("name", Sort.ASCENDING).findAll();

Также вы можете попробовать вручную обновить данные вашего адаптера.

private void Ascending_order() {
    RealmResults<Employee> result = realm.where(Employee.class)
            .sort("name", Sort.ASCENDING).findAll();
    employeedetailadapter.updateData(result); // update data inside adapter before calling 'notifyDataSetChanged'
    employeedetailadapter.notifyDataSetChanged();
 }

Вам нужно создать метод updateData самостоятельно:

public void updateData(RealmResults<Employee> result) {
    employeeDetaillists = new ArrayList<Employee>(result);
}
  • 0
    Я показываю добавленные элементы в списке. когда я нажимаю кнопку (имя кнопки в порядке возрастания), в списке просмотра отображаются в порядке возрастания и убывания (если нажать кнопку в порядке убывания).
  • 0
    @Ана Я обновил свой ответ, чтобы показать другой подход.
Показать ещё 12 комментариев
0

вы можете отсортировать царство, как показано ниже

 RealmResults<Employee> result = realm.where(Employee.class)
            .findAllSorted("name", Sort.ASCENDING);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню