Массив строк Realm в Android

Я пытался программно сохранить массив строк в базе данных Realm, как указано ниже:

Класс модели:

  public class Station extends RealmObject {
  private String name;

  // ... Generated getters and setters ...
  }

Сохранение данных:

  realm.executeTransactionAsync(new Realm.Transaction() {
  @Override
  public void execute(Realm realm) {
    Station station1 =     realm.createObject(Station.class)
    station1.setName(name1);
   Station station2 = realm.createObject(Station.class)
    station2.setName(name2);
  //goes on till station8000
   }
   }, new Realm.Transaction.OnSuccess() {
  @Override
  public void onSuccess() {
    // ...
 });

Есть ли альтернативный лучший способ для этого?


person V1 Kr    schedule 20.08.2016    source источник


Ответы (1)


Почему да, конечно есть

public class Station extends RealmObject {
    private String name;

    // ... Generated getters and setters ...
}

а также

// field variable
RealmResults<Station> stations;
// field variable
RealmChangeListener<RealmResults<Station>> changeListener = new RealmChangeListener<RealmResults<Station>>() {
    @Override
    public void onChange(RealmResults<Station> results) {
        // handle onSuccess()
    }
}

а также

stations = realm.where(Station.class).findAll();
stations.addChangeListener(changeListener);

realm.executeTransactionAsync(new Realm.Transaction() {
   @Override
   public void execute(Realm realm) {
      Station station = new Station();
      for(String stationName : listOfStationNames) {
          station.setName(stationName);
          realm.insert(station);
      }
   }
});

РЕДАКТИРОВАТЬ: Проверьте этот сексуальный спиннер.

public class DropdownSpinnerAdapter
        extends BaseAdapter
        implements SpinnerAdapter {
    private static final String TAG = "DropdownSpinnerAdapter";

    private boolean isItemSelected;

    RealmResults<Station> content;

    public ResultDropdownSpinnerAdapter(RealmResults<Station> objects) {
        this.content = objects;
    }

    @Override
    public int getCount() {
        if(content == null || !content.isValid()) {
            return 1;
        }
        return content.size() + 1;
    }

    @Override
    public String getItem(int position) {
        if(position <= 0) {
            return "";
        }
        return content.get(position - 1);
    }

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

    public int findPosition(Station selectedItem) {
        for(int i = 0, s = content.size(); i < s; i++) {
            Station item = content.get(i);
            if(item.equals(selectedItem)) {
                return i + 1;
            }
        }
        return 0;
    }


    static class ViewHolder {
        TextView textView;
        ImageView imageView;

        public ViewHolder(View convertView) {
            textView = ButterKnife.findById(convertView, R.id.dropdown_textview);
            imageView = ButterKnife.findById(convertView, R.id.dropdown_arrow);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView != null) {
            if(!(convertView instanceof DropdownHeaderView)) {
                convertView = null;
            }
        }
        if(convertView == null) {
            convertView = LayoutInflater.from(parent.getContext())
                    .inflate((isItemSelected) ? R.layout.dropdown_selected : R.layout.dropdown,
                            parent,
                            false);
            ViewHolder viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.textView.setText(getItem(position).getName());
        return convertView;
    }

    public void setItemSelected(boolean selected) {
        this.isItemSelected = selected;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if(convertView != null) {
            if(!(convertView instanceof DropdownView)) {
                convertView = null;
            }
        }
        if(convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.dropdown_noarrow, parent, false);
            ViewHolder viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        }
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.textView.setText(getItem(position).getName());
        return convertView;
    }

    public void updateContent(RealmResults<Station> content) {
        this.content = content;
        notifyDataSetChanged();
    }
}
person EpicPandaForce    schedule 20.08.2016
comment
Что такое «listOfStationNames» здесь? я не понял - person V1 Kr; 20.08.2016
comment
содержимое name1, name2, ... name8000 в списке - person EpicPandaForce; 20.08.2016
comment
Быстрый ответ... спасибо... мне нужно это проверить... я прокомментирую здесь, как только закончу - person V1 Kr; 20.08.2016
comment
Но вы не упомянули realm.copyToRealm или realm.createObject. Разве я не должен использовать любой из них? Также я не видел realm.insert в их документах. - person V1 Kr; 20.08.2016
comment
Он был добавлен в v1.1.0, а последняя версия - v1.2.0 (в последнее время я использую 1.1.1) - person EpicPandaForce; 20.08.2016
comment
Так я могу использовать его в 1.2? - person V1 Kr; 20.08.2016
comment
да конечно и надо! insert() быстрее для этого варианта использования, чем copyToRealm() (и чем createObject()) - person EpicPandaForce; 20.08.2016
comment
Эй, это работает..НО при отображении в счетчике это выглядит так: Station = [{name;station1}]......Station = [{name;station2}].......и т. д. вместо station1 ...станция2...и т.д. Я попытался преобразовать ReamResults в ArrayList‹Strings›, но это не сработало. - person V1 Kr; 21.08.2016
comment
Это потому, что ваш Spinner, кажется, вызывает для них toString(), вам нужно переопределить свои методы getView() и getDropDownView(), чтобы вместо этого установить getItem(position).getName(). Это сука, поэтому я отредактирую свое решение для этого в своем посте. - person EpicPandaForce; 21.08.2016
comment
ооооо или вы можете просто переопределить toString() в Station, чтобы вернуть return name;, и это также решит эту проблему, я думаю, лол - person EpicPandaForce; 21.08.2016
comment
Нет, нет, нет... это: Station = [{name;station1}]......Station = [{name;station2}].......и т. д. вместо station1...station2... и т. д. (без двойных кавычек). Кроме того, toString не поддерживается внутри объекта области, верно? - person V1 Kr; 22.08.2016
comment
Аааа, тогда вы отображаете весь RealmResults как один элемент. Я думаю, что ArrayAdapter должно работать, если вы переопределите toString() в Station, что стало возможным с тех пор, как 0.88.3 - person EpicPandaForce; 22.08.2016
comment
Может быть, я прочитал старый учебник о toString! Спасибо! В настоящее время я делаю это как: ArrayAdapter‹String›(это, android.R.layout.simple_list_item_1, RealmResults a).. ​​теперь давайте проверим ваше предложение toString.. - person V1 Kr; 22.08.2016
comment
Рад, что смог помочь :) - person EpicPandaForce; 23.08.2016
comment
эй, не могли бы вы помочь с этим: stackoverflow. com/questions/39096308/ - person V1 Kr; 23.08.2016