Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

CRUD - 삭제 - React Native SDK

이 페이지의 내용

  • 객체 삭제
  • 여러 객체 삭제
  • Realm의 모든 객체 삭제

이 페이지의 예시에서는 다음 스키마를 사용합니다.

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 구성 요소 예시에서 다음을 수행합니다.

  1. 컴포넌트 내에서 useRealm() 후크를 호출하여 열려 있는 Realm 인스턴스에 대한 액세스 권한을 가져옵니다.

  2. Dog을(를) useQuery() 후크로 전달하여 영역 인스턴스에 있는 모든 개를 검색하세요.

  3. Dog 객체를 매개변수로 취하는 구성 요소 메서드 deleteDog()을(를) 생성하세요. 이 메서드 내에서는 Realm.delete()을(를) Dog 객체로 전달하여 영역에서 삭제합니다.

  4. 지도 및 "개 삭제" 버튼이 포함된 구성 요소 목록을 렌더링합니다.Text name

  5. 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에서 오류가 발생합니다.

다음과 같은 몇 가지 방법으로 영역에서 여러 객체를 삭제할 수 있습니다.

  1. 영역에서 지정된 객체 유형의 모든 객체 삭제를 실행하려면 useQuery(<ObjectType>)의 결과를 쓰기 트랜잭션(write transaction) 내부의 Realm.delete() 메서드로 전달하세요.

  2. Realm에서 특정 객체를 여러 개 삭제 하려면 Collection.filtered() 를 쓰기 트랜잭션(write transaction) 내부의 Realm.delete() (으)로 전달합니다.

다음 예시에서는 DogList 컴포넌트를 사용합니다.

  1. useRealm() 후크를 사용하여 영역 인스턴스를 검색하세요.

  2. Dog 클래스를 useQuery() 후크로 전달해서 변수 myDogs을(를) 모든 Dog 객체로 설정하세요.

  3. 쓰기 트랜잭션(write transaction)을 수행하는 구성 요소 메서드 deleteAllYoungDogObjects()을(를) 생성하세요. 쓰기 트랜잭션(write transaction) 내에서는 3세 미만의 모든 개를 구할 수 있는 쿼리를 사용하여 myDogs.filtered()의 결과에 대해 변수인 youngDogs을(를) 설정해야 합니다. 그런 다음 youngDogs을(를) realm.delete()(으)로 전달해서 영역에서 어린 개를 모두 삭제하세요.

  4. 쓰기 트랜잭션(write transaction)을 수행하는 구성 요소 메서드 deleteAllDogObjects()을(를) 생성하세요. 쓰기 트랜잭션(write transaction) 내에서는 myDogs을(를) realm.delete()(으)로 전달해서 영역에서 모든 개를 삭제해야 합니다.

  5. Text 지도 nameage 를 포함하는 구성 요소 목록을 렌더링합니다.

  6. deleteAllYoungDogObjects()을(를) 호출하는 "Delete Young Dog Objects(어린 개 객체 삭제)" 버튼에 onPress 이벤트를 추가하면 영역에서 어린 개가 모두 삭제됩니다. 이로써 재렌더링이 시작되고 해당 객체가 UI에서 제거됩니다.

  7. 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'
/>
</>
);
};

영역에서 모든 객체를 삭제하려면 쓰기 트랜잭션(write transaction) 내부에서 Realm.deleteAll()을(를) 호출하세요. 이렇게 하면 모든 객체 인스턴스의 영역이 지워지면서도 영역의 스키마에는 영향을 주지 않습니다.

다음 예시에서는 DeleteProfileSettingsScreen 컴포넌트를 사용합니다.

  1. 구성 요소 내에서 useRealm() 훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.

  2. 쓰기 트랜잭션(write transaction)을 수행하고 Realm.deleteAll()을(를) 호출하여 영역에서 모든 객체를 삭제하는 구성 요소 메서드 deleteAllData()을(를) 생성하세요.

  3. 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()은(는) 개발 과정에서 영역을 신속하게 정리할 수 있는 유용한 메서드입니다. 그 예로 마이그레이션을 작성해서 객체를 새 스키마로 업데이트하는 것보다는, 앱 자체로 객체를 삭제했다가 다시 생성하는 것이 더 빠를 수 있습니다.

돌아가기

Update