안드로이드 앱에서 Parse를 활용한 관계형 쿼리 구현하기
안드로이드에서의 관계형 쿼리
소개
이 가이드에서는 Parse에서 관계형 쿼리를 수행하고 이러한 쿼리를 사용하여 안드로이드 앱을 구현합니다. Back4App과 안드로이드를 사용하여 현실적인 데이터를 설정하고 쿼리하는 방법을 배웁니다.
이 튜토리얼은 compileSdk = 30로 생성된 앱을 사용합니다. minSdk = 23 및 targetSdk = 30
언제든지 이 튜토리얼로 구축된 전체 안드로이드 프로젝트에 접근할 수 있습니다. 우리의 Github 저장소에서 확인하세요.
목표
우리의 목표는 Back4App에서 데이터를 쿼리하는 것입니다. 안드로이드 앱에서.
우리가 달성할 목표의 미리보기를 보여드립니다:

필수 조건
이 튜토리얼을 완료하려면 다음이 필요합니다:
- Back4App에서 생성된 앱.
- Back4App에 연결된 안드로이드 앱.
시작해봅시다!
다음 단계에 앞서, 우리는 Back4App을(를) 우리의 애플리케이션에 연결해야 합니다. appId와 clientKey를 Back4App에서 string.xml 파일에 저장한 후, Parse를 우리의 App.java 또는 App.kt 파일에서 초기화해야 합니다. 새 Parse 앱 튜토리얼을(를) 따라 하세요. Parse를(을) 앱에 초기화하는 방법을 모른다면.
또는 위에 공유한 깃허브 링크에서 프로젝트를 다운로드하고 appId와 clientKey 부분만 수정할 수 있습니다.
언제든지 이 튜토리얼로 구축된 전체 Android 프로젝트에 접근할 수 있습니다. 우리의 깃허브 저장소에서 확인하세요.
1 - Back4App에 데이터 저장하기
이 단계에서는 제공된 JS 콘솔과 자바스크립트 코드를 사용하여 클래스를 생성하고 Parse를 위해 이 클래스에 대한 쿼리를 생성할 것입니다.
이 가이드에서 쿼리의 대상이 될 다양한 클래스를 생성해 보겠습니다. 클래스는 다음과 같습니다: 저자, 책, 출판사 및 서점, 여기서 책은 출판사와 1:N 관계를 가지며 저자와 N:N 관계를 가집니다. 그리고 서점은 책과 N:N 관계를 가집니다.
Parse JS 콘솔에서는 JavaScript 코드를 직접 실행하여 JS SDK 명령을 사용하여 애플리케이션 데이터베이스 내용을 쿼리하고 업데이트할 수 있습니다. 아래 코드를 JS 콘솔에서 실행하고 Back4App에 데이터를 삽입하세요. 대시보드에서 JS 콘솔은 다음과 같이 보입니다:

다음 예제 내용을 사용하여 클래스를 생성하세요:
1 // Add objects and create tables
2 // Authors
3 const AuthorA = new Parse.Object('Author');
4 AuthorA.set('name', 'Aaron Writer');
5 await AuthorA.save();
6
7 const AuthorB = new Parse.Object('Author');
8 AuthorB.set('name', 'Beatrice Novelist');
9 await AuthorB.save();
10
11 const AuthorC = new Parse.Object('Author');
12 AuthorC.set('name', 'Casey Columnist');
13 await AuthorC.save();
14
15 // Publishers
16 const PublisherA = new Parse.Object('Publisher');
17 PublisherA.set('name', 'Acacia Publishings');
18 await PublisherA.save();
19
20 const PublisherB = new Parse.Object('Publisher');
21 PublisherB.set('name', 'Birch Distributions');
22 await PublisherB.save();
23
24 // Books
25 const BookA = new Parse.Object('Book');
26 BookA.set('title', 'A Love Story');
27 BookA.set('publisher', PublisherA);
28 BookA.set('publishingDate', new Date('05/07/1998'));
29 const BookARelation = BookA.relation("authors");
30 BookARelation.add(AuthorA);
31 await BookA.save();
32
33 const BookB = new Parse.Object('Book');
34 BookB.set('title', 'Benevolent Elves');
35 BookB.set('publisher', PublisherB);
36 BookB.set('publishingDate', new Date('11/31/2008'));
37 const BookBRelation = BookB.relation("authors");
38 BookBRelation.add(AuthorB);
39 await BookB.save();
40
41 const BookC = new Parse.Object('Book');
42 BookC.set('title', 'Can You Believe It?');
43 BookC.set('publisher', PublisherB);
44 BookC.set('publishingDate', new Date('08/21/2018'));
45 const BookCRelation = BookC.relation("authors");
46 BookCRelation.add(AuthorA);
47 BookCRelation.add(AuthorC);
48 await BookC.save();
49
50 // BookStore
51 const BookStoreA = new Parse.Object('BookStore');
52 BookStoreA.set('name', 'Books of Love');
53 const BookStoreARelation = BookStoreA.relation("books");
54 BookStoreARelation.add(BookA);
55 await BookStoreA.save();
56
57 const BookStoreB = new Parse.Object('BookStore');
58 BookStoreB.set('name', 'Fantasy Books');
59 const BookStoreBRelation = BookStoreB.relation("books");
60 BookStoreBRelation.add(BookB);
61 await BookStoreB.save();
62
63 const BookStoreC = new Parse.Object('BookStore');
64 BookStoreC.set('name', 'General Books');
65 const BookStoreCRelation = BookStoreC.relation("books");
66 BookStoreCRelation.add(BookA);
67 BookStoreCRelation.add(BookC);
68 await BookStoreC.save();
69
70 console.log('Success');2 - Android 앱에서 데이터 쿼리하기
모든 클래스를 채웠으니, 이제 몇 가지 관계형 쿼리를 수행할 수 있습니다. 출판사에 따라 결과를 필터링해 보겠습니다. 책을 검색하여 출판사 “Acacia Publishings” (또는 “출판사 A”)에 속하는 책을 찾기 위해 기본 ParseQuery.equalTo 메서드를 사용합니다:
1 progressDialog.show();
2 ParseQuery<ParseObject> publisherQuery = new ParseQuery<>("Publisher");
3 publisherQuery.whereEqualTo("name", "Acacia Publishings");
4 try {
5 ParseObject publisher = publisherQuery.getFirst();
6 ParseQuery<ParseObject> bookQuery = new ParseQuery<ParseObject>("Book");
7 bookQuery.whereEqualTo("publisher", publisher);
8 bookQuery.findInBackground((objects, e) -> {
9 progressDialog.hide();
10 if (e == null) {
11 initData(objects);
12 } else {
13 Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
14 }
15 });
16 } catch (ParseException e) {
17 progressDialog.hide();
18 e.printStackTrace();
19 }이제 BookStore 객체가 Book 객체를 포함하고 있는지 쿼리해 보겠습니다. 출판 날짜가 2010년 1월 1일 이후인 객체를 찾기 위해 ParseQuery.whereGreaterThan 메서드와 ParseQuery.whereMatchesQuery 메서드를 사용합니다:
1 progressDialog.show();
2 ParseQuery<ParseObject> bookQuery = new ParseQuery<>("Book");
3
4 Calendar calendar = Calendar.getInstance();
5 calendar.set(2010,1,1,59,59,59);
6 Date date = calendar.getTime();
7
8 bookQuery.whereGreaterThan("publishingDate", date);
9
10 ParseQuery<ParseObject> bookStoreQuery = new ParseQuery<>("BookStore");
11 bookStoreQuery.whereMatchesQuery("books",bookQuery);
12 bookStoreQuery.findInBackground((objects, e) -> {
13 progressDialog.hide();
14 if (e==null){
15 initData(objects);
16 } else {
17 Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
18 }
19 });이제 더 복잡한 관계형 쿼리를 만들어 보겠습니다. 서점 객체를 찾고 있습니다. 이 객체는 최소한 하나의 책이 “ 작가 “Aaron Writer” (또는 “AuthorA”)에 의해 작성되었습니다. whereEqualTo 및 whereMatchesQuery:
1 progressDialog.show();
2 ParseQuery<ParseObject> authorQuery = new ParseQuery<>("Author");
3 authorQuery.whereEqualTo("name","Aaron Writer");
4 try {
5 ParseObject authorA = authorQuery.getFirst();
6 ParseQuery<ParseObject> bookQuery = new ParseQuery<>("Book");
7 bookQuery.whereEqualTo("authors",authorA);
8
9 ParseQuery<ParseObject> bookStoreQuery = new ParseQuery<>("BookStore");
10 bookStoreQuery.whereMatchesQuery("books",bookQuery);
11
12 bookStoreQuery.findInBackground((objects, e) -> {
13 progressDialog.hide();
14 if (e==null){
15 initData(objects);
16 } else {
17 Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
18 }
19 });
20
21
22 } catch (ParseException e) {
23 progressDialog.hide();
24 e.printStackTrace();
25 }완료되었습니다!
이 가이드를 마치면, Parse에서 관계형 쿼리가 어떻게 작동하는지와 Android 앱에서 Back4App에서 이를 수행하는 방법을 배웠습니다.