CRUD - 삭제 - React Native SDK
이 페이지의 내용
이 페이지의 예시에서는 다음 스키마를 사용합니다.
class Dog extends Realm.Object { static schema = { name: 'Dog', properties: { name: 'string', owners: { type: 'list', objectType: 'Person', optional: true, }, age: 'int?', }, }; }
class Dog extends Realm.Object<Dog> { name!: string; owner?: Realm.List<Person>; age?: number; static schema: ObjectSchema = { name: 'Dog', properties: { name: 'string', owners: { type: 'list', objectType: 'Person', optional: true, }, age: 'int?', }, }; }
객체 삭제
영역 에서 객체 를 삭제 하려면 객체 를 Realm 으로 전달합니다. 삭제() 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내부.
다음 DogList
구성 요소 예시에서 다음을 수행합니다.
컴포넌트 내에서
useRealm()
후크를 호출하여 열려 있는 Realm 인스턴스에 대한 액세스 권한을 가져옵니다.Dog
을(를)useQuery()
후크로 전달하여 영역 인스턴스에 있는 모든 개를 검색하세요.Dog
객체를 매개변수로 취하는 구성 요소 메서드deleteDog()
을(를) 생성하세요. 이 메서드 내에서는Realm.delete()
을(를)Dog
객체로 전달하여 영역에서 삭제합니다.onPress 추가 구성 요소의
deleteDog()
메서드를 호출하는 "Delete Dog" 버튼의 이벤트입니다.
const DogList = () => { const realm = useRealm(); const myDogs = useQuery(Dog); const deleteDog = deletableDog => { realm.write(() => { realm.delete(deletableDog); }); }; return ( <> {myDogs.map(dog => { return ( <> <Text>{dog.name}</Text> <Button onPress={() => deleteDog(dog)} title='Delete Dog' /> </> ); })} </> ); };
const DogList = () => { const realm = useRealm(); const myDogs = useQuery(Dog); const deleteDog = (deletableDog: Dog) => { realm.write(() => { realm.delete(deletableDog); }); }; return ( <> {myDogs.map(dog => { return ( <> <Text>{dog.name}</Text> <Button onPress={() => deleteDog(dog)} title='Delete Dog' /> </> ); })} </> ); };
중요
삭제 후 객체를 사용하지 않아야 합니다.
Realm에서 객체를 삭제한 후에는 해당 객체에 액세스하거나 수정할 수 없습니다. 삭제된 객체를 사용하려고 하면 Realm에서 오류가 발생합니다.
여러 객체 삭제
다음과 같은 몇 가지 방법으로 영역에서 여러 객체를 삭제할 수 있습니다.
영역에서 지정된 객체 유형의 모든 객체 삭제를 실행하려면 useQuery(<ObjectType>)의 결과를 쓰기 트랜잭션(write transaction) 내부의 Realm.delete() 메서드로 전달하세요.
Realm에서 특정 객체를 여러 개 삭제 하려면 Collection.filtered() 를 쓰기 트랜잭션(write transaction) 내부의
Realm.delete()
(으)로 전달합니다.
다음 예시에서는 DogList
컴포넌트를 사용합니다.
useRealm()
후크를 사용하여 영역 인스턴스를 검색하세요.Dog
클래스를useQuery()
후크로 전달해서 변수myDogs
을(를) 모든Dog
객체로 설정하세요.쓰기 트랜잭션(write transaction)을 수행하는 구성 요소 메서드
deleteAllYoungDogObjects()
을(를) 생성하세요. 쓰기 트랜잭션(write transaction) 내에서는 3세 미만의 모든 개를 구할 수 있는 쿼리를 사용하여myDogs.filtered()
의 결과에 대해 변수인youngDogs
을(를) 설정해야 합니다. 그런 다음youngDogs
을(를)realm.delete()
(으)로 전달해서 영역에서 어린 개를 모두 삭제하세요.쓰기 트랜잭션(write transaction)을 수행하는 구성 요소 메서드
deleteAllDogObjects()
을(를) 생성하세요. 쓰기 트랜잭션(write transaction) 내에서는myDogs
을(를)realm.delete()
(으)로 전달해서 영역에서 모든 개를 삭제해야 합니다.deleteAllYoungDogObjects()
을(를) 호출하는 "Delete Young Dog Objects(어린 개 객체 삭제)" 버튼에onPress
이벤트를 추가하면 영역에서 어린 개가 모두 삭제됩니다. 이로써 재렌더링이 시작되고 해당 객체가 UI에서 제거됩니다.deleteAllDogObjects()
을(를) 호출하는 "Delete All Dog Objects(모든 개 객체 삭제)" 버튼에onPress
이벤트를 추가하면 영역에서 모든 개가 삭제됩니다. 이로써 재렌더링이 시작되고 해당 객체가 UI에서 제거됩니다.
참고
영역 인스턴스에서 객체를 삭제하면 구성 요소가 자동으로 재렌더링되면서 UI에서 객체를 제거합니다.
const DogList = () => { const realm = useRealm(); const myDogs = useQuery(Dog); const deleteAllYoungDogObjects = () => { const youngDogs = useQuery(Dog, dogs => { return dogs.filtered('age < 3'); }); realm.write(() => { realm.delete(youngDogs); }); }; const deleteAllDogObjects = () => { realm.write(() => { realm.delete(myDogs); }); }; return ( <> {myDogs.map(dog => { return ( <> <Text>{dog.name}</Text> <Text>{dog.age}</Text> </> ); })} <Button onPress={() => deleteAllYoungDogObjects()} title='Delete Young Dog Objects' /> <Button onPress={() => deleteAllDogObjects()} title='Delete All Dog Objects' /> </> ); };
const DogList = () => { const realm = useRealm(); const myDogs = useQuery(Dog); const deleteAllYoungDogObjects = () => { const youngDogs = useQuery(Dog, dogs => { return dogs.filtered('age < 3'); }); realm.write(() => { realm.delete(youngDogs); }); }; const deleteAllDogObjects = () => { realm.write(() => { realm.delete(myDogs); }); }; return ( <> {myDogs.map(dog => { return ( <> <Text>{dog.name}</Text> <Text>{dog.age}</Text> </> ); })} <Button onPress={() => deleteAllYoungDogObjects()} title='Delete Young Dog Objects' /> <Button onPress={() => deleteAllDogObjects()} title='Delete All Dog Objects' /> </> ); };
Realm의 모든 객체 삭제
영역에서 모든 객체를 삭제하려면 쓰기 트랜잭션(write transaction) 내부에서 Realm.deleteAll()을(를) 호출하세요. 이렇게 하면 모든 객체 인스턴스의 영역이 지워지면서도 영역의 스키마에는 영향을 주지 않습니다.
다음 예시에서는 DeleteProfileSettingsScreen
컴포넌트를 사용합니다.
구성 요소 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.쓰기 트랜잭션(write transaction)을 수행하고
Realm.deleteAll()
을(를) 호출하여 영역에서 모든 객체를 삭제하는 구성 요소 메서드deleteAllData()
을(를) 생성하세요.deleteAllData()
을(를) 호출하는 "Delete all data(모든 데이터 삭제)" 버튼에onPress
이벤트를 추가하세요.
const DeleteProfileSettingsScreen = () => { const realm = useRealm(); const deleteAllData = () => { realm.write(() => { realm.deleteAll(); }); }; return ( <> <Text>Delete all data in your profile:</Text> <Button onPress={deleteAllData} title='Delete all data' /> </> ); };
const DeleteProfileSettingsScreen = () => { const realm = useRealm(); const deleteAllData = () => { realm.write(() => { realm.deleteAll(); }); }; return ( <> <Text>Delete all data in your profile:</Text> <Button onPress={deleteAllData} title='Delete all data' /> </> ); };
팁
개발 중 모두 삭제
Realm.deleteAll()은(는) 개발 과정에서 영역을 신속하게 정리할 수 있는 유용한 메서드입니다. 그 예로 마이그레이션을 작성해서 객체를 새 스키마로 업데이트하는 것보다는, 앱 자체로 객체를 삭제했다가 다시 생성하는 것이 더 빠를 수 있습니다.