Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

세트 - React Native SDK

이 페이지의 내용

  • Realm 객체 모델
  • 세트를 사용하여 객체 만들기
  • 세트에 항목 추가
  • 세트에 특정 항목이 있는지 확인하고 세트의 크기 확인하기
  • 세트 정보 제거
  • 세트 트래버스

버전 realm@10.5.0의 새로운 기능

Realm 세트는 고유한 값 컬렉션 을 저장 수 있는 특수 객체 입니다. Realm 세트는 JavaScript 세트 를 기반으로 합니다. 그러나 단일 유형의 값만 포함할 수 있으며 쓰기 트랜잭션( 쓰기 트랜잭션 (write transaction)) 내에서만 수정할 수 있습니다. 세트를 사용하면 두 세트 간의 합집합, 교집합 또는 차이를 찾는 것과 같은 수학 연산을 수행할 수 있습니다. 이러한 연산을 수행하는 방법에 학습 보려면 MDN 문서의 기본 설정하다 연산 구현하기를 참조하세요.

다음 두 가지 방법으로 Realm 객체 모델 속성 유형을 Realm 세트로 정의할 수 있습니다.

  • 세트에 포함될 데이터 유형을 지정한 다음 <>을(를) 입력합니다.

  • 더 복잡한 속성에는 객체 표기법과 type 필드를 사용하세요.

1class 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}
1class 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 객체를 생성합니다. 각 문자의 inventorylevelsCompleted 세트를 초기값이 있는 배열로 설정합니다.

  • Character 클래스를 useQuery() 후크에 전달하여 영역 인스턴스의 모든 문자를 조회합니다.

  • UI에서 각 캐릭터의 이름을 Text 요소로 표시합니다.

1const 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};
1const 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 상태 변수를 변경하는 TextInputaddInventoryItem() 메서드를 호출하는 Button을(를) 렌더링합니다.

1const 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};
1const 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 상태 변수를 변경하는 TextInputqueryCharacterInventory 메서드를 호출하는 Button을(를) 렌더링합니다.

1const 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};
1const 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와(과) removeInventoryItemremoveAllInventory 메서드를 각각 호출하는 두 개의 Button 구성 요소를 렌더링합니다.

1const 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};
1const 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 상태 변수를 변경하는 TextInputaddInventoryItem() 메서드를 호출하는 Button을(를) 렌더링합니다.

  • inventory 배열 상태 변수를 반복하여 캐릭터의 인벤토리 항목 목록을 세트에 추가한 순서대로 렌더링합니다.

  • character.inventory을(를) 반복하여 캐릭터 인벤토리의 순서가 지정되지 않은 목록을 렌더링합니다.

1const 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};
1const 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};

돌아가기

딕셔너리 (Dictionaries)