Область — Вторая вставка с ошибкой бросков: Ошибка: «xxx» должно быть типа «строка», получил «null» (null)

#react-native #realm

Вопрос:

Обновление до Realm 10.8.0 в React-Native проекте, когда я выполняю вставку/запись в схему, первая выполняется успешно, но вторая вставка выдает следующую ошибку: Error: Workflows.InternalName must be of type 'string', got 'null' (null)

Я не могу определить, почему первая вставка прошла успешно, а вторая-с ошибками? Это текст в песочнице, где значения жестко закодированы и определенно нет null .

пакет.json

 "react": "17.0.2",
"react-native": "0.65.1",    
"realm": "^10.8.0"
 

App.js

     import React from 'react';
    import { View, Button, StyleSheet } from 'react-native';
    import Realm from 'realm';

    class Workflows {
        ExternalName;
        InternalName;

        static schema = {
            name: 'Workflows',
            primaryKey: 'InternalName',
            properties: {
                ExternalName: 'string',
                InternalName: 'string',
            }
        };
    }

    export default class App extends React.Component {
        constructor() {
            super();
            this.realm = new Realm({
                schema: [Workflows],
                schemaVersion: 1,
            });
            console.log("Db: Realm created");
        }

        record;
        ctr = 0;

        saveData = () => {
            let workflows = new Workflows();
            workflows.InternalName = "Internal Name"   this.ctr;
            workflows.ExternalName = "External Name"   this.ctr;
            this.ctr  
            try {
                this.realm.write(() => {
                    this.record = this.realm.create(Workflows.schema.name, workflows);
                })
                this.record = this.realm.objects(Workflows.schema.name);
                console.log(`The lists of workflows are: ${this.record.map((workflow) => workflow.InternalName)}`);
            }
            catch (error) {
                console.log(error)
            }
        }

        render () {
            return (
                <View style={styles.appContainer} >
                    <Button title="Save Realm data" onPress={this.saveData} />                      
                </View>
            );
        }
    }

    const styles = StyleSheet.create({
        appContainer: {
            flex: 1,
            alignItems: 'center',
            justifyContent: 'center',
            flexDirection: 'row',
        }
    })
 

Следующий тест дает другие результаты.

  1. Добавление ведения журнала после new Workflows() и последующего назначения показывает, что второй workflows объект не создается должным образом (но ТОЛЬКО в том случае, если realm.create он есть в коде).
      let workflows = new Workflows();
     workflows.InternalName = "Internal Name"   this.ctr;
     workflows.ExternalName = "External Name"   this.ctr;
     console.log("workflows InternalName: "   workflows.InternalName)
     console.log("workflows ExternalName: "   workflows.ExternalName)
     console.log("workflows object: ", workflows)
    
     *CONSOLE OUTPUT*
     LOG  Running "Test" with {"rootTag":171}
     LOG  Db: Realm created
     LOG  workflows InternalName: Internal Name0
     LOG  workflows ExternalName: External Name0
     LOG  workflows object:  {"ExternalName": "External Name0", "InternalName": "Internal Name0"}
     LOG  The lists of workflows are: Internal Name0
     LOG  workflows InternalName: null
     LOG  workflows ExternalName: null
     LOG  workflows object:  {}
     LOG  [Error: Workflows.InternalName must be of type 'string', got 'null' (null)]
     
  2. Использование следующего realm.create работает каждый раз (по сравнению с передачей переменной объекта):
    this.realm.create(Workflows.schema.name, { InternalName: "Internal Name" this.ctr, ExternalName: "External Name" this.ctr });
  3. Закомментируйте this.realm.create(Workflows.schema.name, workflows); , что привело к правильному созданию и назначению объекта, но, очевидно, теперь выполняется запись/вставка.

Комментарии:

1. Пожалуйста, убедитесь, что вы включили в свой вопрос детали отладки и что вы последовательно проходите через свой код, проверяя свои переменные вдоль них, пока что-то не покажется неправильным. Это this.ctr; подозрительно, но нам действительно нужно знать, что вы сделали для устранения неполадок.

2. @Jay — Во второй раз, когда я нажимаю кнопку и new поднимаю второй экземпляр Workflow свойств, которые никогда не назначаются или их там нет, они остаются пустыми (не неопределенными). Кроме того, если я запущу эту же программу в отладке react-native, она будет работать нормально. Кроме того, если я жестко закодирую и передам объект для сохранения, он сработает, пример: this.realm.create(Workflows.schema.name, { InternalName: "Internal Name" this.ctr, ExternalName: "External Name" this.ctr }); Я очень озадачен, почему это происходит. Если я закомментирую оператор realm.create и не сохраню объект, он будет создан, как ожидалось.

3. Я обновлю выше то, что я пробовал, и результаты, сначала я не включил это, потому что хотел короткий краткий пост.