#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',
}
})
Следующий тест дает другие результаты.
- Добавление ведения журнала после
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)]
- Использование следующего
realm.create
работает каждый раз (по сравнению с передачей переменной объекта):
this.realm.create(Workflows.schema.name, { InternalName: "Internal Name" this.ctr, ExternalName: "External Name" this.ctr });
- Закомментируйте
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. Я обновлю выше то, что я пробовал, и результаты, сначала я не включил это, потому что хотел короткий краткий пост.