Проблема с созданием объекта realm (исключение IllegalStateException: невозможно изменить управляемые объекты вне транзакции записи)

#java #android #realm

#java #Android #realm

Вопрос:

У меня возникла проблема с добавлением новых объектов в базу данных Realm. У меня есть расширенный объект Realm класса продукта и мой основной код в основном действии. Когда я запускаю приложение без

Product product1 = myRealm.createObject(Product.class);

введенные объекты добавляются (отображаются на экране) в список Realm, и они исчезают, когда я перехожу к другому действию (тоже проблема, но не тот случай). Я вижу ссылку на эту строку кода в Logcat. «java.lang.Исключение IllegalStateException: невозможно изменить управляемые объекты вне транзакции записи. «

продукт также является строкой, так что теперь вы понимаете, что означает

setProduct .

У меня также возникают проблемы при добавлении

myRealm.commitTransaction()

или что-то в этом роде.

   public class MainActivity extends AppCompatActivity {
static View view1;
EditText editText;
static RealmList<Product> productRealmList;
static Realm myRealm = Realm.getDefaultInstance();

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

    Product TV = new Product("TV");
    Product watch = new Product("Watch");

    productRealmList = new RealmList<>();
    productRealmList.add(TV);
    productRealmList.add(watch);

    MyAdapter adapter = new MyAdapter(this, R.layout.adapter_layout, productRealmList);
    listView.setAdapter(adapter);


    findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            view1 = LayoutInflater.from(MainActivity.this).inflate(R.layout.alert_layout, null);
            editText = view1.findViewById(R.id.ent);
            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("Create new product")
                    .setMessage("Put down the name of the new product")
                    .setView(view1)
                    .setNegativeButton("Cancel", null)
                    .setPositiveButton("Add",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
  Product product1 = myRealm.createObject(Product.class);
                                        product1.setProduct(editText.getText().toString());
productRealmList.add(product1);

                                }
                            })

                    .create()
                    .show();
        }
    });
  

Я хочу сохранить продукты в базе данных и RealmList, когда пользователь вводит название своего продукта (ов) и нажимает Добавить в диалоговом окне предупреждения. (хотите, чтобы они отображались на экране)

Ответ №1:

Вам необходимо создать свой RealmObject внутри транзакции, о чем также сообщает исключение.

Взгляните на:https://realm.io/docs/java/latest/#transaction-blocks

Внутри вашего OnClickListener сделайте это:

 realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        final Product product1 = myRealm.createObject(Product.class);
        product1.setProduct(editText.getText().toString());
        productRealmList.add(product1);
    }
});
  

Возможно, вам также придется создать свой productRealmList внутри транзакции или, по крайней мере, извлечь его из Realm внутри вашего блока транзакций, но мне немного сложно протестировать без создания совершенно нового проекта с Realm внутри.