Проблема с удалением объекта в утилите просмотра в Realm - PullRequest
0 голосов
/ 04 сентября 2018

У меня проблема с удалением объекта в программе просмотра. Когда я нажимаю кнопку в элементе RV, у меня появляется ошибка: java.lang.IllegalArgumentException: недопустимый аргумент: это поле (id) не может быть пустым. Ошибка в этой строке в RealmHelper: RealmResults results = realm.where (Task.class) .equalTo ("id", taskID) .findAll ();

MainActivity:

открытый класс MainActivity расширяет AppCompatActivity, реализует IRecyclerItemClickListener {

@Nullable
@BindView(R.id.floating_button) FloatingActionButton floatingButton;

RecyclerView recyclerView;
MainAdapter mainAdapter;

Realm realm;
RealmHelper realmHelper;
RealmResults<Task> results;
List<Task> tasks;
String taskID;
int position;

private static final String TAG = "MainActivity";


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

    ButterKnife.bind(this);

    recyclerView = findViewById(R.id.recycler_view);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    Realm.init(this);
    RealmConfiguration configuration = new RealmConfiguration
            .Builder()
            .deleteRealmIfMigrationNeeded()
            .build();
    realm = Realm.getInstance(configuration);



    realmHelper = new RealmHelper(realm);
    tasks = new ArrayList<>();
    tasks = realmHelper.getAllTasks();

    mainAdapter = new MainAdapter(tasks,this);
    recyclerView.setAdapter(mainAdapter);
    onDeleteClick(position);

}


@Optional
@OnClick(R.id.floating_button)
public void onClick() {

    android.app.Fragment fragment = new TaskFragment();

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.main_activity, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

}


public void showFloatingActionButton() {
    floatingButton.show();
}


public void hideFloatingActionButton() {
    floatingButton.hide();
}


@Override
public void onBackPressed() {
    super.onBackPressed();
    showFloatingActionButton();
    recyclerView.removeAllViews();
}


@Override
protected void onDestroy() {
    realm.close();
    super.onDestroy();
}


@Override
public void onDeleteClick(int position) {

    realmHelper.deleteTask(taskID, position);
    Log.d(TAG, "ON DELETE CLICK " + taskID);

}

}

RealmHelper:

public class RealmHelper {

Realm realm;

private  static ArrayList<Task> taskArrayList = new ArrayList<>();
private static final String TAG = "RealmHelper";
MainAdapter mainAdapter;


public RealmHelper(Realm realm) {
    this.realm = realm;
}


public void saveTask(final Task task) {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Task t = realm.copyToRealm(task);
        }
    });

}


public List<Task> getAllTasks() {
   RealmResults<Task> taskResult = realm.where(Task.class).findAll();

    return taskResult;
}


public void deleteTask( String taskID, int position) {
    RealmResults<Task> results = realm.where(Task.class).equalTo("id", taskID).findAll();
    if (results.size() != 0) {
        realm.beginTransaction();
        results.deleteAllFromRealm();
        realm.commitTransaction();
        taskArrayList.remove(position);
        mainAdapter.notifyDataSetChanged();
    }

}

}

1 Ответ

0 голосов
/ 05 сентября 2018

В MainActivity вы определяете поле taskID, но никогда не инициализируете его. Это означает, что он имеет значение по умолчанию для String, которое равно null.

Я предполагаю, что каждый Task объект в вашем tasks списке имеет некоторый идентификатор. Поскольку вы уже получаете аргумент позиции, вы можете использовать его для получения идентификатора на лету.

@Override
public void onDeleteClick(int position) {
    Task task = tasks.get(position);
    String id = task.getTaskID(); // or whatever the correct call is
    realmHelper.deleteTask(id, position);

    Log.d(TAG, "ON DELETE CLICK " + taskID);
}
...