세트 - React Native SDK
버전 realm@10.5.0
의 새로운 기능
Realm 세트는 고유한 값 컬렉션 을 저장 수 있는 특수 객체 입니다. Realm 세트는 JavaScript 세트 를 기반으로 합니다. 그러나 단일 유형의 값만 포함할 수 있으며 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내에서만 수정할 수 있습니다. 세트를 사용하면 두 세트 간의 합집합, 교집합 또는 차이를 찾는 것과 같은 수학 연산을 수행할 수 있습니다. 이러한 연산을 수행하는 방법에 학습 보려면 MDN 문서의 기본 설정하다 연산 구현하기를 참조하세요.
Realm 객체 모델
다음 두 가지 방법으로 Realm 객체 모델 속성 유형을 Realm 세트로 정의할 수 있습니다.
세트에 포함될 데이터 유형을 지정한 다음
<>
을(를) 입력합니다.더 복잡한 속성에는 객체 표기법과
type
필드를 사용하세요.
1 class Character extends Realm.Object { 2 static schema = { 3 name: 'Character', 4 primaryKey: '_id', 5 properties: { 6 _id: 'objectId', 7 name: 'string', 8 levelsCompleted: 'int<>', 9 inventory: { 10 type: 'set', 11 objectType: 'string', 12 }, 13 }, 14 }; 15 }
1 class Character extends Realm.Object<Character> { 2 _id!: Realm.BSON.ObjectId; 3 name!: string; 4 levelsCompleted!: Realm.Set<number>; 5 inventory!: Realm.Set<string>; 6 7 static schema: ObjectSchema = { 8 name: 'Character', 9 primaryKey: '_id', 10 properties: { 11 _id: 'objectId', 12 name: 'string', 13 levelsCompleted: 'int<>', 14 inventory: { 15 type: 'set', 16 objectType: 'string', 17 }, 18 }, 19 }; 20 }
세트를 사용하여 객체 만들기
Realm 세트 속성이 포함된 객체를 생성하려면 쓰기 트랜잭션(write transaction) 내에서 객체를 생성해야 합니다. Realm 객체를 정의할 때 초기값이 포함된 빈 배열 또는 배열을 전달하여 Realm Set을 초기화하세요.
예시
다음 CreateInitialCharacters
구성요소 예시에서는 속성 설정을 사용하여 Character
객체를 만듭니다.
CreateInitialCharacters
컴포넌트는 다음을 수행합니다.
컴포넌트 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.React의 useEffect 사용 후크를 사용하여
useEffect
및 빈 종속성 배열을 사용하여 익명 함수를 한 번만 호출합니다. 익명 함수 내에서 쓰기 트랜잭션(write transaction) 내에 두 개의 서로 다른Character
객체를 생성합니다. 각 문자의inventory
및levelsCompleted
세트를 초기값이 있는 배열로 설정합니다.Character
클래스를useQuery()
후크에 전달하여 영역 인스턴스의 모든 문자를 조회합니다.UI에서 각 캐릭터의 이름을
Text
요소로 표시합니다.
1 const CreateInitialCharacters = () => { 2 const realm = useRealm(); 3 useEffect(() => { 4 realm.write(() => { 5 realm.create('Character', { 6 _id: new Realm.BSON.ObjectId(), 7 name: 'AdventurousPlayer', 8 inventory: ['elixir', 'compass', 'glowing shield'], 9 levelsCompleted: [4, 9], 10 }); 11 }); 12 realm.write(() => { 13 realm.create('Character', { 14 _id: new Realm.BSON.ObjectId(), 15 name: 'HealerPlayer', 16 inventory: ['estus flask', 'gloves', 'rune'], 17 levelsCompleted: [1, 2, 5, 24], 18 }); 19 }); 20 }, []); 21 const characters = useQuery(Character); 22 23 return ( 24 <View> 25 {characters.map(character => ( 26 <View key={character._id}> 27 <Text>{character.name}</Text> 28 </View> 29 ))} 30 </View> 31 ); 32 };
1 const CreateInitialCharacters = () => { 2 const realm = useRealm(); 3 useEffect(() => { 4 realm.write(() => { 5 realm.create('Character', { 6 _id: new Realm.BSON.ObjectId(), 7 name: 'AdventurousPlayer', 8 inventory: ['elixir', 'compass', 'glowing shield'], 9 levelsCompleted: [4, 9], 10 }); 11 }); 12 13 realm.write(() => { 14 realm.create('Character', { 15 _id: new Realm.BSON.ObjectId(), 16 name: 'HealerPlayer', 17 inventory: ['estus flask', 'gloves', 'rune'], 18 levelsCompleted: [1, 2, 5, 24], 19 }); 20 }); 21 }, []); 22 const characters = useQuery(Character); 23 24 return ( 25 <View> 26 {characters.map(character => ( 27 <View key={character._id}> 28 <Text>{character.name}</Text> 29 </View> 30 ))} 31 </View> 32 ); 33 };
세트에 항목 추가
세트에 항목을 추가하려면 쓰기 트랜잭션(write transaction) 내에서 Realm.Set.add() 메서드에 새 값을 전달합니다.
예시
다음 AddInventoryToCharacter
구성 요소 예시에서는 캐릭터의 인벤토리에 새 세트 요소를 추가합니다.
AddInventoryToCharacter
컴포넌트는 다음을 수행합니다.
컴포넌트 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.인벤토리 세트에 추가할 새 인벤토리 항목을 나타내는 'inventoryItem'이라는 상태 변수를 생성합니다.
Character
클래스를useQuery()
후크에 전달하고 Collection.filtered() 메서드를 사용하여 프롭 과 일치하는 이름을 가진 문자를characterName
필터링합니다. . 그런 다음 변수character
을(를) 첫 번째 일치하는 결과로 설정합니다.inventoryItem
상태 변수를Realm.Set.add()
에 전달하여 캐릭터의 인벤토리에 인벤토리 항목을 추가하는 쓰기 트랜잭션(write transaction)을 수행하는 구성요소 메서드addInventoryItem()
을(를) 생성합니다.inventoryItem
상태 변수를 변경하는TextInput
및addInventoryItem()
메서드를 호출하는Button
을(를) 렌더링합니다.
1 const AddInventoryToCharacter = ({characterName}) => { 2 const realm = useRealm(); 3 const [inventoryItem, setInventoryItem] = useState(''); 4 const character = useQuery( 5 Character, 6 characters => { 7 return characters.filtered(`name = '${characterName}'`); 8 }, 9 [characterName], 10 )[0]; 11 12 const addInventoryItem = () => { 13 realm.write(() => { 14 character?.inventory.add(inventoryItem); 15 }); 16 }; 17 18 return ( 19 <View> 20 <TextInput 21 onChangeText={text => setInventoryItem(text)} 22 value={inventoryItem} 23 /> 24 <Button 25 title='Add Inventory Item' 26 onPress={addInventoryItem} 27 /> 28 </View> 29 ); 30 };
1 const AddInventoryToCharacter = ({ 2 characterName, 3 }: { 4 characterName: string; 5 }) => { 6 const realm = useRealm(); 7 const [inventoryItem, setInventoryItem] = useState(''); 8 const character = useQuery( 9 Character, 10 characters => { 11 return characters.filtered(`name = '${characterName}'`); 12 }, 13 [characterName], 14 )[0]; 15 16 const addInventoryItem = () => { 17 realm.write(() => { 18 character?.inventory.add(inventoryItem); 19 }); 20 }; 21 22 return ( 23 <View> 24 <TextInput 25 onChangeText={text => setInventoryItem(text)} 26 value={inventoryItem} 27 /> 28 <Button 29 title='Add Inventory Item' 30 onPress={addInventoryItem} 31 /> 32 </View> 33 ); 34 };
세트에 특정 항목이 있는지 확인하고 세트의 크기 확인하기
세트의 크기나 특정 아이템이 들어 있는지 여부 등 세트에 대한 정보를 확인하는 것이 좋습니다.
세트에 특정 값이 포함되어 있는지 확인하려면 값을 Realm.Set.has() 메서드. 세트에 지정된 값이 포함되어 있으면 이 메서드는 true
을 반환합니다.
세트에 포함된 항목 수를 확인하려면 세트의 size
속성을 확인합니다.
예시
다음 QueryCharacterInventory
구성 요소 예시에서는 캐릭터의 인벤토리 크기와 특정 아이템이 있는지 확인합니다.
QueryCharacterInventory
컴포넌트는 다음을 수행합니다.
캐릭터의 인벤토리를 검색할 인벤토리 항목을 나타내는 'nventoryItem'이라는 상태 변수를 생성합니다.
useQuery
후크를 사용하여 모든 문자에 대한 쿼리를 수행하고 구성 요소에 프롭으로 전달된characterName
와(과) 일치하는 이름의 문자만 포함하도록 결과를 필터링합니다. 그러면 첫 번째 매칭 결과를 얻게 됩니다.Character
클래스를useQuery()
후크에 전달하고 Collection.filtered() 메서드를 실행하여characterName
프롭과 일치하는 이름을 가진 문자를 필터링합니다. 그런 다음 변수character
를 첫 번째 일치하는 결과로 설정합니다.inventoryItem
상태 변수를Realm.Set.has()
에 전달하여 캐릭터의 인벤토리에 항목이 포함되어 있는지 확인하는 구성 요소 메서드queryCharacterInventory
를 생성합니다. 캐릭터의 인벤토리에 해당 항목이 포함된 경우 메서드 는 즉, 캐릭터가 아이템을 가지고 있다는 것입니다. 캐릭터의 인벤토리에 항목이 포함되어 있지 않은 경우 메서드는 캐릭터에 해당 항목이 없음을 경고합니다.캐릭터 이름을 렌더링하고 캐릭터 인벤토리의
size
속성을 사용하여 인벤토리 크기를 렌더링합니다. 또한inventoryItem
상태 변수를 변경하는TextInput
및queryCharacterInventory
메서드를 호출하는Button
을(를) 렌더링합니다.
1 const QueryCharacterInventory = ({characterName}) => { 2 const [inventoryItem, setInventoryItem] = useState(''); 3 const character = useQuery( 4 Character, 5 characters => { 6 return characters.filtered(`name = '${characterName}'`); 7 }, 8 [characterName], 9 )[0]; 10 11 const queryCharacterInventory = () => { 12 const characterDoesHaveItem = character.inventory.has(inventoryItem); 13 if (characterDoesHaveItem) { 14 Alert.alert(`Character has item: ${inventoryItem}`); 15 } else { 16 Alert.alert(`Item not found in character's inventory`); 17 } 18 }; 19 return ( 20 <View> 21 <Text>{character.name}</Text> 22 <Text> 23 Total number of inventory items: {character.inventory.size} 24 </Text> 25 <TextInput 26 onChangeText={text => setInventoryItem(text)} 27 value={inventoryItem} 28 /> 29 <Button 30 title='Query for Inventory' 31 onPress={queryCharacterInventory} 32 /> 33 </View> 34 ); 35 };
1 const QueryCharacterInventory = ({ 2 characterName, 3 }: { 4 characterName: string; 5 }) => { 6 const [inventoryItem, setInventoryItem] = useState(''); 7 const character = useQuery( 8 Character, 9 characters => { 10 return characters.filtered(`name = '${characterName}'`); 11 }, 12 [characterName], 13 )[0]; 14 15 const queryCharacterInventory = () => { 16 const characterDoesHaveItem: Boolean = 17 character.inventory.has(inventoryItem); 18 if (characterDoesHaveItem) { 19 Alert.alert(`Character has item: ${inventoryItem}`); 20 } else { 21 Alert.alert(`Item not found in character's inventory`); 22 } 23 }; 24 return ( 25 <View> 26 <Text>{character.name}</Text> 27 <Text> 28 Total number of inventory items: {character.inventory.size} 29 </Text> 30 <TextInput 31 onChangeText={text => setInventoryItem(text)} 32 value={inventoryItem} 33 /> 34 <Button 35 title='Query for Inventory' 36 onPress={queryCharacterInventory} 37 /> 38 </View> 39 ); 40 };
세트 정보 제거
세트에서 특정 항목 또는 모든 항목을 제거할 수 있습니다.
세트에서 특정 값을 제거하려면 쓰기 트랜잭션(write transaction) 내에서 Realm.Set.delete() 메서드에 값을 전달합니다.
세트를 지우려면 쓰기 트랜잭션(write transaction) 내에서 Realm.Set.clear() 메서드를 실행합니다.
예시
다음 RemoveInventoryFromCharacter
구성요소 예시에서는 세트에서 특정 항목을 제거하고 모든 항목의 세트를 지웁니다.
RemoveInventoryFromCharacter
컴포넌트는 다음을 수행합니다.
컴포넌트 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.인벤토리 세트에서 제거할 인벤토리 항목을 나타내는 'inventoryItem'이라는 상태 변수를 생성합니다.
inventoryItem
상태 변수를Realm.Set.delete()
(으)로 전달하여 캐릭터의 인벤토리에서 항목을 제거하는 구성 요소 메서드removeInventoryItem
을(를) 생성합니다.Realm.Set.clear()
을(를) 호출하여 캐릭터의 인벤토리에서 모든 항목을 제거하는 구성 요소 메서드removeAllInventory
을(를) 생성합니다.inventoryItem
상태 변수를 변경하는TextInput
와(과)removeInventoryItem
및removeAllInventory
메서드를 각각 호출하는 두 개의Button
구성 요소를 렌더링합니다.
1 const RemoveInventoryFromCharacter = ({characterName}) => { 2 const realm = useRealm(); 3 const [inventoryItem, setInventoryItem] = useState(''); 4 const character = useQuery( 5 Character, 6 characters => { 7 return characters.filtered(`name = '${characterName}'`); 8 }, 9 [characterName], 10 )[0]; 11 12 const removeInventoryItem = () => { 13 realm.write(() => { 14 character?.inventory.delete(inventoryItem); 15 }); 16 }; 17 const removeAllInventory = () => { 18 realm.write(() => { 19 character?.inventory.clear(); 20 }); 21 }; 22 return ( 23 <View> 24 <Text>{character.name}</Text> 25 <TextInput 26 onChangeText={text => setInventoryItem(text)} 27 value={inventoryItem} 28 /> 29 <Button 30 title='Remove Inventory Item' 31 onPress={removeInventoryItem} 32 /> 33 <Button 34 title='Remove All Inventory' 35 onPress={removeAllInventory} 36 /> 37 </View> 38 ); 39 };
1 const RemoveInventoryFromCharacter = ({ 2 characterName, 3 }: { 4 characterName: string; 5 }) => { 6 const realm = useRealm(); 7 const [inventoryItem, setInventoryItem] = useState(''); 8 const character = useQuery( 9 Character, 10 characters => { 11 return characters.filtered(`name = '${characterName}'`); 12 }, 13 [characterName], 14 )[0]; 15 16 const removeInventoryItem = () => { 17 realm.write(() => { 18 character?.inventory.delete(inventoryItem); 19 }); 20 }; 21 const removeAllInventory = () => { 22 realm.write(() => { 23 character?.inventory.clear(); 24 }); 25 }; 26 return ( 27 <View> 28 <Text>{character.name}</Text> 29 <TextInput 30 onChangeText={text => setInventoryItem(text)} 31 value={inventoryItem} 32 /> 33 <Button 34 title='Remove Inventory Item' 35 onPress={removeInventoryItem} 36 /> 37 <Button 38 title='Remove All Inventory' 39 onPress={removeAllInventory} 40 /> 41 </View> 42 ); 43 };
세트 트래버스
세트를 이동하여 세트의 각 항목에 액세스할 수 있습니다. 세트를 탐색하려면 메서드 Set.map()
또는 대체 반복 메서드를 사용합니다.
그러나 기본적으로 세트에 있는 항목의 순서는 보장되지 않습니다. 세트를 순서대로 이동하려면 상태 변수 에 세트의 항목을 저장하면 됩니다. 세트에 새 항목을 추가할 때 해당 상태 변수를 업데이트합니다.
예시
다음 TraverseCharacterInventory
구성 요소 예시에서 캐릭터는 인벤토리 항목 없이 시작됩니다. 사용자가 인벤토리 세트에 항목을 추가하면 구성 요소가 세트의 각 항목을 정렬된 목록과 정렬되지 않은 목록 모두에 표시합니다.
TraverseCharacterInventory
컴포넌트는 다음을 수행합니다.
컴포넌트 내에서
useRealm()
훅을 호출하여 열린 영역 인스턴스에 대한 액세스 권한을 얻습니다.인벤토리 세트에 추가할 새 인벤토리 항목을 나타내는 'inventoryItem'이라는 상태 변수를 생성합니다.
캐릭터의 인벤토리 항목을 삽입 순서대로 보관할 'inventory' 상태 변수를 만듭니다.
Character
클래스를useQuery()
후크에 전달하고 Collection.filtered() 메서드를 사용하여 프롭 과 일치하는 이름을 가진 문자를characterName
필터링합니다. . 그런 다음 변수character
을(를) 첫 번째 일치하는 결과로 설정합니다.inventoryItem
상태 변수를 Realm.Set.add() 에 전달하여 캐릭터의 인벤토리에 인벤토리 항목을 추가하는 쓰기 트랜잭션(write transaction)을 수행하는 구성 요소 메서드addInventoryItem()
을(를) 생성합니다. 메서드. 쓰기 트랜잭션(write transaction) 후 메서드는inventory
배열 상태 변수에inventoryItem
을(를) 추가합니다.inventoryItem
상태 변수를 변경하는TextInput
및addInventoryItem()
메서드를 호출하는Button
을(를) 렌더링합니다.inventory
배열 상태 변수를 반복하여 캐릭터의 인벤토리 항목 목록을 세트에 추가한 순서대로 렌더링합니다.character.inventory
을(를) 반복하여 캐릭터 인벤토리의 순서가 지정되지 않은 목록을 렌더링합니다.
1 const TraverseCharacterInventory = ({characterName}) => { 2 const realm = useRealm(); 3 const [inventoryItem, setInventoryItem] = useState(''); 4 const [inventory, setInventory] = useState([]); 5 6 const character = useQuery( 7 Character, 8 characters => { 9 return characters.filtered(`name = '${characterName}'`); 10 }, 11 [characterName], 12 )[0]; 13 14 const addInventoryItem = () => { 15 realm.write(() => { 16 character?.inventory.add(inventoryItem); 17 }); 18 setInventory([...inventory, inventoryItem]); 19 }; 20 21 return ( 22 <View> 23 <Text>{character.name}</Text> 24 <Text>Add an item to the inventory:</Text> 25 <TextInput 26 onChangeText={text => setInventoryItem(text)} 27 value={inventoryItem} 28 /> 29 <Button 30 title='Add Inventory Item' 31 onPress={addInventoryItem} 32 /> 33 34 <Text>Ordered Inventory:</Text> 35 {inventory.map(item => ( 36 <Text>{item}</Text> 37 ))} 38 39 <Text>Unordered Inventory:</Text> 40 {character.inventory.map(item => ( 41 <Text>{item}</Text> 42 ))} 43 </View> 44 ); 45 };
1 const TraverseCharacterInventory = ({ 2 characterName, 3 }: { 4 characterName: string; 5 }) => { 6 const realm = useRealm(); 7 const [inventoryItem, setInventoryItem] = useState<string>(''); 8 const [inventory, setInventory] = useState<string[]>([]); 9 10 const character = useQuery( 11 Character, 12 characters => { 13 return characters.filtered(`name = '${characterName}'`); 14 }, 15 [characterName], 16 )[0]; 17 18 const addInventoryItem = () => { 19 realm.write(() => { 20 character?.inventory.add(inventoryItem); 21 }); 22 setInventory([...inventory, inventoryItem]); 23 }; 24 25 return ( 26 <View> 27 <Text>{character.name}</Text> 28 <Text>Add an item to the inventory:</Text> 29 <TextInput 30 onChangeText={text => setInventoryItem(text)} 31 value={inventoryItem} 32 /> 33 <Button 34 title='Add Inventory Item' 35 onPress={addInventoryItem} 36 /> 37 38 <Text>Ordered Inventory:</Text> 39 {inventory.map(item => ( 40 <Text>{item}</Text> 41 ))} 42 43 <Text>Unordered Inventory:</Text> 44 {character.inventory.map(item => ( 45 <Text>{item}</Text> 46 ))} 47 </View> 48 ); 49 };