【问题标题】:Android Realm and on a null object reference in fragmentAndroid领域和片段中的空对象引用
【发布时间】:2018-08-26 21:09:38
【问题描述】:

我正在寻找我的问题的答案。这是我第一次接触 Realm 数据库,我在保存数据期间遇到片段中的空对象引用问题。有谁知道我做错了什么?

辅助方法:

public void saveTask(final String text, final String date, final String time ) {
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            Task task = bgRealm.createObject(Task.class);
            task.setText(text);
            task.setDate(date);
            task.setTime(time);
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // Transaction was a success.
            Log.d(TAG, "ON_SUCCESS: Data Written Successfully");
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // Transaction failed and was automatically canceled.
            Log.d(TAG, "ON_ERROR: Error");
        }
    });

}

片段中的 OnClick 方法:

@OnClick(R.id.save_button)
public void onClickSave() {

    realmHelper.saveTask(title_text.getText().toString().trim(), date_text.getText().toString().trim(), time_text.getText().toString().trim());
}

onCreateView 内的代码:

    ButterKnife.bind(this, view);

    ((MainActivity) getActivity()).hideFloatingActionButton();

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

我尝试了在 onClick 方法中使用 textview 字段的解决方案,但仍然相同。

【问题讨论】:

  • null object reference 给了你什么?
  • 方法 saveTask.
  • realm inside realmHelper 未初始化。
  • 是的。问题出在 Helper 构造函数中。

标签: android realm


【解决方案1】:

从您在片段中的OnClick 方法中,我观察到您有一个领域助手类,您创建了一个名为realmHelper 的实例。由于您正在异步使用领域,我建议您将实例化领域对象传递给辅助方法或在帮助方法或类中重新实例化领域。

将领域实例传递给辅助方法

public void saveTask(Realm realm, final String text, final String date, final String time ) {
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            Task task = bgRealm.createObject(Task.class);
            task.setText(text);
            task.setDate(date);
            task.setTime(time);
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // Transaction was a success.
            Log.d(TAG, "ON_SUCCESS: Data Written Successfully");
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // Transaction failed and was automatically canceled.
            Log.d(TAG, "ON_ERROR: Error");
        }
    });

}

在辅助方法中实例化领域

public void saveTask(Context context, final String text, final String date, final String time ) {
    Realm.init(context);
    RealmConfiguration configuration = new RealmConfiguration
        .Builder()
        .deleteRealmIfMigrationNeeded()
        .build();
    Realm realm = Realm.getInstance(configuration);
    realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm bgRealm) {
            Task task = bgRealm.createObject(Task.class);
            task.setText(text);
            task.setDate(date);
            task.setTime(time);
        }
    }, new Realm.Transaction.OnSuccess() {
        @Override
        public void onSuccess() {
            // Transaction was a success.
            Log.d(TAG, "ON_SUCCESS: Data Written Successfully");
        }
    }, new Realm.Transaction.OnError() {
        @Override
        public void onError(Throwable error) {
            // Transaction failed and was automatically canceled.
            Log.d(TAG, "ON_ERROR: Error");
        }
    });

}

【讨论】:

  • 我使用了你的两个版本,第二个版本显示了这个错误:android.content.Context, java.lang.String, java.lang.String, java.lang.String)' 在一个空对象上参考 错误仍在 saveTask 方法中。在第一个解决方案中,错误是:如果用于打开同一个文件,配置不能不同。所以我从 onCreateView 中删除了代码,它是空对象引用。你知道在片段中使用 Realm 的一些舒适的解决方案吗?我在Activity中可以做到,但是我真的不知道我在fragment中做错了什么。
  • 等等,让我们澄清一下。辅助方法是在辅助类中还是在同一个活动中?如果可能,请显示不同的课程和活动,以便我知道问题所在?
  • 问题出在构造函数中,我重建了方法。现在好了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多