【问题标题】:Problem with deleting object in recyclerview in Realm在 Realm 的 recyclerview 中删除对象的问题
【发布时间】:2018-09-04 20:36:52
【问题描述】:

我在删除 recyclerview 中的对象时遇到问题。当我单击 RV 项目中的按钮时,出现错误:java.lang.IllegalArgumentException: Illegal Argument: This field(id) is not nullable。 RealmHelper 中的这一行出现错误:RealmResults results = realm.where(Task.class).equalTo("id", taskID).findAll();

主活动:

公共类 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);

}

}

领域助手:

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();
    }

}

}

【问题讨论】:

  • 显然taskID 为空

标签: android android-recyclerview realm


【解决方案1】:

MainActivity 中,您定义了一个taskID 字段,但您从未对其进行初始化。这意味着它具有字符串的默认值,即null

我猜你的tasks 列表中的每个Task 对象都有某种id。由于您已经获得了一个位置参数,您可以使用它来即时获取 id。

@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);
}

【讨论】:

  • 哇!你说的对!它是如此简单,我没有看到它。谢谢!
猜你喜欢
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2016-08-12
  • 2011-08-12
相关资源
最近更新 更多