Разрабатывая приложение React Native для Android, я полностью застрял с проблемой, касающейся базы данных Realm.
Приложение позволяет пользователю запрашивать предварительно заполненную базу данных через панель поиска. Например, вы вводите имя, такое как «Джон», и выполняется запрос к базе данных, возвращая всех людей с именем «Джон».
В настоящее время база данных Realm запускается при каждом рендеринге, который вообще не работает:
import ...
const SearchBar = props => {
let [inputValue, setInputValue] = useState(null);
const sendInputValueToReduxStore = text => {
setInputValue(text);
props.setInputValueSearchBar(text);
};
const peopleSchema = {
name: 'realm',
properties: {
name: 'string?',
color: 'string?',
},
};
let realm = new Realm({
path: fs.DocumentDirectoryPath + '/default.realm',
schema: [peopleSchema],
readOnly: true,
});
const people = realm.objects('realm');
let resultArray = [];
const databaseRequest = () => {
const query = inputValue;
const result = inputValue
? people.filtered("name == '" + query + "'")
: 'default';
resultArray = Array.from(result);
return resultArray.map(oneGuy => (
<Text className="oneGuy" key={oneGuy.name}>
{oneGuy.name}
</Text>
));
};
const isText = props.text;
return (
<View>
<Header searchBar rounded>
<Item>
<Icon name="ios-search" />
<Input
placeholder="Search"
onChangeText={text => sendInputValueToReduxStore(text)}
value={inputValue}
/>
</Item>
</Header>
{isText && (
<View>
<Text>{props.text}</Text>
</View>
)}
<View>{databaseRequest()}</View>
</View>
);
};
export default SearchBar;
Итак, я хотел бы поместить эти части:
const peopleSchema = {
name: 'realm',
properties: {
name: 'string?',
color: 'string?',
},
};
let realm = new Realm({
path: fs.DocumentDirectoryPath + '/default.realm',
schema: [peopleSchema],
readOnly: true,
});
... в useEffect()
-Крюк с пустым массивом зависимостей для создания базы данных Realm только один раз при первом рендеринге. Но когда я это делаю, React жалуется, что «назначения переменной области будут потеряны после каждого рендера».
![enter image description here](https://i.stack.imgur.com/gZaGJ.png)
Но я думаю, что это не будет Это не большая проблема, так как я хочу только открыть и запросить базу данных.
Я читал об использовании useRef()
-Hook для решения проблемы выше, но мне интересно, имеет ли смысл весь мой подход (открытие базы данных только один раз). Будет ли лучше просто оставить компонент выше как есть и не заботясь о его фазах жизненного цикла?