안드로이드에서 Parse 데이터 유형 사용 및 관리 가이드
안드로이드에서 데이터 유형 파싱
소개
이 가이드에서는 안드로이드를 사용하여 Parse 데이터 유형에 대해 배웁니다. 안드로이드 앱에서 Back4App의 Parse 객체를 읽고 저장할 것입니다.
Parse에 데이터를 저장하는 것은 ParseObject. 각 ParseObject는 JSON 호환 데이터의 키-값 쌍을 포함합니다. 이 데이터는 스키마가 없으므로 각 ParseObject에 어떤 키가 존재하는지 미리 지정할 필요가 없습니다. 우리는 원하는 키-값 쌍을 설정할 수 있으며, 우리의 백엔드는 이를 저장합니다. 예를 들어, 게임의 최고 점수를 추적한다고 가정해 보겠습니다. 단일 ParseObject는 다음과 같은 내용을 포함할 수 있습니다:
키는 영숫자 문자열이어야 하며, 값은 다음과 같을 수 있습니다:
- 문자열=> 문자열
- 숫자(다음과 같은 원시 숫자 값 int,double)
- 불리언=> boolean
- 날짜 및 시간=> java.util.Date
- 널=> JSONObject.NULL
- 배열=>JSONArray
- 파일=> Parse File
- 포인터=> 다른 ParseObject
- 관계=> ParseRelation
- 지오포인트=> ParseGeoPoint
각 ParseObject는 우리가 다양한 종류의 데이터를 구별하는 데 사용할 수 있는 클래스 이름을 가지고 있습니다. 예를 들어, 우리는 최고 점수 객체를 GameScore라고 부를 수 있습니다. 또한 편의를 위해 제공되는 몇 가지 필드를 지정할 필요가 없습니다:
- objectId는 저장된 각 객체에 대한 고유 식별자입니다.
- createdAt와 updatedAt은 각 객체가 클라우드에서 생성되고 마지막으로 수정된 시간을 나타냅니다.
이 필드는 새 ParseObject를 저장할 때 Back4app에 의해 자동으로 채워집니다.
우리는 당신에게 NameYourClassesLikeThis (UpperCamelCase) 및 nameYourKeysLikeThis (lowerCamelCase)를 사용할 것을 권장합니다. 코드를 깔끔하게 유지하기 위해서입니다.
이 튜토리얼은 Android Studio 4.1.1에서 생성된 기본 앱을 사용합니다. buildToolsVersion=30.0.2 , Compile SDK Version = 30.0.2 및 targetSdkVersion 30
언제든지 GitHub 리포지토리를 통해 전체 프로젝트에 접근할 수 있습니다.
목표
우리의 목표는 Parse Server에서 제공하는 모든 데이터 유형을 처리할 수 있는 Android 앱을 만드는 것입니다. 여기 우리가 달성할 것에 대한 미리보기입니다:

전제 조건
이 튜토리얼을 완료하려면 다음이 필요합니다:
- Back4App에서 생성된 앱.
- Back4App에 연결된 안드로이드 앱.
우리 앱 이해하기
Parse에 대한 더 나은 이해를 위한 앱을 만들 것입니다 데이터 유형. 이 안드로이드 앱에서는 DataTypes라는 클래스에서 모든 데이터 유형을 생성하고 이 클래스의 변수에 값을 할당합니다. 그런 다음 이 데이터를 읽고 업데이트할 것입니다.
참고 데이터 유형 포인터, 관계, 파일, 지오포인트은 나중에 특정 가이드에서 다룰 것입니다.
시작해봅시다!
1 - 앱 템플릿 만들기
다음 변수를 MainActivity에 정의하고 onCreate 메서드의 코드를 다음 코드로 교체합니다.
1 private ProgressDialog progressDialog;
2 private View popupInputDialogView;
3 private RecyclerView recyclerView;
4 private String objectId;
5 private static final String TAG = "MainActivity";
6
7 @Override
8 protected void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.activity_main);
11
12 progressDialog = new ProgressDialog(MainActivity.this);
13
14 Button saveData = findViewById(R.id.saveData);
15 Button readData = findViewById(R.id.readData);
16 Button updateData = findViewById(R.id.updateData);
17
18 saveData.setOnClickListener(saveDataView -> {
19 try {
20 saveDataTypes();
21 } catch (JSONException e) {
22 e.printStackTrace();
23 }
24 });
25
26 readData.setOnClickListener(readDataView -> readObjects());
27
28 updateData.setOnClickListener(updateDataView -> updateObject());
29
30 }다음 단계에 앞서, Back4App을(를) 우리 애플리케이션에 연결해야 합니다. appId와 clientKey를 Back4App에서 string.xml 파일에 저장한 후, Parse를 우리 App.java 또는 App.kt 파일에서 초기화해야 합니다. 새 Parse 앱 튜토리얼을(를) 따라가세요. Parse를(을) 앱에 초기화하는 방법을 모른다면.
2 - 객체 저장을 위한 코드
create 함수는 Back4app 데이터베이스에 새로운 객체를 생성합니다. 우리는 saveDataTypes 함수를 정의하고 onCreate 함수에서 호출합니다. 이 함수에서 다음 코드를 사용합니다. 우리는 이 함수를 사용하여 모든 데이터 유형을 DataTypes 클래스 객체에 저장할 것입니다.
1 private void saveDataTypes() throws JSONException{
2 ParseObject parseObject = new ParseObject("DataTypes");
3
4 parseObject.put("stringField", "String");
5 parseObject.put("doubleField", 1.5);
6 parseObject.put("intField", 2);
7 parseObject.put("boolField", true);
8 parseObject.put("dateField", Calendar.getInstance().getTime());
9
10 JSONObject myObject = new JSONObject();
11 myObject.put("number", 1);
12 myObject.put("string", "42");
13
14 parseObject.put("jsonObject", myObject);
15
16
17 JSONArray myArray = new JSONArray();
18 myArray.put(myObject);
19 myArray.put(myObject);
20 myArray.put(myObject);
21
22 parseObject.put("jsonArray", myArray);
23
24
25 List<String> list = new ArrayList<>();
26 list.add("string1");
27 list.add("string2");
28 parseObject.put("listStringField", list);
29
30 List<Integer> listInt = new ArrayList<>();
31 listInt.add(1);
32 listInt.add(2);
33 listInt.add(3);
34 parseObject.put("listIntField", listInt);
35
36 List<Boolean> listBool = new ArrayList<>();
37 listBool.add(true);
38 listBool.add(false);
39 parseObject.put("listBoolField", listBool);
40
41 progressDialog.show();
42 parseObject.saveInBackground(e -> {
43 progressDialog.dismiss();
44 if (e == null) {
45 Toast.makeText(this, "Object created successfully...", Toast.LENGTH_SHORT).show();
46 objectId = parseObject.getObjectId();
47 } else {
48 objectId = null;
49 Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
50 }
51 });
52 }3 - 객체 읽기 코드
우리는 objectId 변수를 saveDataTypes 함수에서 쿼리에 매개변수로 전달하고, saveDataTypes 함수에서 저장한 데이터를 readObjects 함수로 읽어올 것입니다.
1 private void readObjects() {
2 if (objectId == null) {
3 Toast.makeText(this, "No object. Click on the 'Save Data' button before.", Toast.LENGTH_SHORT).show();
4 return;
5 }
6
7 ParseQuery<ParseObject> query = new ParseQuery<>("DataTypes");
8
9 progressDialog.show();
10 query.getInBackground(objectId, (object, e) -> {
11 progressDialog.dismiss();
12 if (e == null) {
13 List<Data> list = new ArrayList<>();
14 list.add(new Data("Int list field",object.get("listIntField").toString()));
15 list.add(new Data("String field",object.get("stringField").toString()));
16 list.add(new Data("Double field",object.get("doubleField").toString()));
17 list.add(new Data("Int field",object.get("intField").toString()));
18 list.add(new Data("String list field",object.get("listStringField").toString()));
19 list.add(new Data("Date field",object.get("dateField").toString()));
20 list.add(new Data("Bool field",object.get("boolField").toString()));
21 list.add(new Data("List Bool field",object.get("listBoolField").toString()));
22 list.add(new Data("Json Object field",object.get("jsonObject").toString()));
23 list.add(new Data("Json Array field",object.get("jsonArray").toString()));
24
25 showDataTypes(list);
26
27 } else {
28 Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
29 }
30 });
31 }이 섹션에서는 데이터라는 모델 클래스를 만들었습니다. 우리는 readObjects 함수에서 얻은 데이터를 사용하여 이 모델 클래스의 객체를 생성합니다. 우리는 이 객체들을 데이터 유형으로 만든 목록의 요소로 제공합니다. 그런 다음 이 목록을 showDataTypes 함수의 매개변수로 제공하고 AlertDialog에 나열합니다.
이것은 데이터 모델입니다.
1 public class Data {
2 private String type;
3 private String value;
4
5 public Data(String type, String value) {
6 this.type = type;
7 this.value = value;
8 }
9
10 public String getType() {
11 return type;
12 }
13
14 public Data setType(String type) {
15 this.type = type;
16 return this;
17 }
18
19 public String getValue() {
20 return value;
21 }
22
23 public Data setValue(String value) {
24 this.value = value;
25 return this;
26 }
27 }이것은 showDataTypes 함수입니다.
1 private fun showDataTypes(list: List<Data>) {
2 val alertDialogBuilder = AlertDialog.Builder(this@MainActivity)
3 alertDialogBuilder.setTitle("Data types")
4 alertDialogBuilder.setCancelable(true)
5 initPopupViewControls(list)
6 //We are setting our custom popup view by AlertDialog.Builder
7 alertDialogBuilder.setView(popupInputDialogView)
8 val alertDialog = alertDialogBuilder.create()
9 alertDialog.show()
10 }
11
12 @SuppressLint("InflateParams")
13 private fun initPopupViewControls(list: List<Data>) {
14 val layoutInflater = LayoutInflater.from(this@MainActivity)
15 popupInputDialogView = layoutInflater.inflate(R.layout.custom_alert_dialog, null)
16 recyclerView = popupInputDialogView?.findViewById(R.id.recyclerView)
17 val adapter = ItemAdapter(this@MainActivity, list)
18 recyclerView?.layoutManager = LinearLayoutManager(
19 this,
20 LinearLayoutManager.VERTICAL,
21 false
22 )
23 recyclerView?.adapter = adapter
24 }4 - 객체 업데이트를 위한 코드
이 updateObject 함수는 saveDataTypes 함수에서 생성된 객체의 데이터를 업데이트하는 역할을 합니다. 우리는 다시 objectId를 사용하여 객체를 업데이트합니다.
1 public void updateObject() {
2 if (objectId == null) {
3 Toast.makeText(this, "No object. Click on the 'Save Data' button before.", Toast.LENGTH_SHORT).show();
4 return;
5 }
6
7 ParseObject parseObject = new ParseObject("DataTypes");
8 parseObject.setObjectId(objectId);
9 parseObject.put("intField", 5);
10 parseObject.put("stringField", "new String");
11
12 progressDialog.show();
13
14 parseObject.saveInBackground(e -> {
15 progressDialog.dismiss();
16 if (e == null) {
17 Toast.makeText(this, "Object updated successfully...", Toast.LENGTH_SHORT).show();
18 } else {
19 Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
20 }
21 });
22 }5 - 카운터 사용하기
위의 예제는 일반적인 사용 사례를 포함하고 있습니다. intField 필드는 우리가 지속적으로 업데이트해야 하는 카운터가 될 수 있습니다. 위의 솔루션은 작동하지만 번거롭고 여러 클라이언트가 동일한 카운터를 업데이트하려고 할 경우 문제를 일으킬 수 있습니다. Parse는 카운터 유형 데이터를 저장하는 데 도움이 되는 모든 숫자 필드를 원자적으로 증가시키는 메서드를 제공합니다. 따라서 동일한 업데이트를 다음과 같이 다시 작성할 수 있습니다:
1 ParseObject parseObject = new ParseObject("DataTypes");
2 parseObject.setObjectId(objectId);
3 parseObject.increment("intField",1);6 - 리스트 사용하기
Parse는 리스트 데이터를 저장하는 데 도움이 되는 메서드도 제공합니다. 리스트 필드를 원자적으로 변경하는 데 사용할 수 있는 세 가지 작업이 있습니다:
- setAdd 및 setAddAll: 주어진 객체를 배열 필드의 끝에 추가합니다.
- setAddUnique 및 setAddAllUnique: 배열 필드에 이미 포함되지 않은 주어진 객체만 해당 필드에 추가합니다. 삽입 위치는 보장되지 않습니다.
- remove 및 removeAll: 주어진 객체의 모든 인스턴스를 배열 필드에서 제거합니다.
6.1 - add 및 addAll 예제
listStringField 의 값은:
아래 코드를 실행합니다:
1 ParseObject parseObject = new ParseObject("DataTypes");
2 parseObject.setObjectId(objectId);
3 parseObject.add("listStringField","e");
4 parseObject.addAll("listStringField", Arrays.asList("e", "f", "g", "g"));
5 parseObject.save();이 명령어 후에 stringList 필드의 결과는:
6.2 - addUnique 및 addAllUnique 예제
listStringField 의 값은:
아래 코드를 실행합니다:
1 ParseObject parseObject = new ParseObject("DataTypes");
2 parseObject.setObjectId(objectId);
3 parseObject.addUnique("listStringField","e");
4 parseObject.addAllUnique("listStringField",Arrays.asList("c", "d", "e", "f"));
5 parseObject.save();이 명령어 후에stringList 필드의 결과는 다음과 같습니다:
값이 중복되지 않았습니다.
6.3 - removeAll을 사용한 예제
listStringField의 값은 다음과 같습니다:
아래 코드를 실행합니다:
1 ParseObject parseObject = new ParseObject("DataTypes");
2 parseObject.setObjectId(objectId);
3 parseObject.removeAll("listStringField",Arrays.asList("c", "d", "e", "f"));
4 parseObject.save();이 명령어 후에 stringList 필드의 결과는 다음과 같습니다:
참고 현재 동일한 저장에서 배열의 항목을 원자적으로 추가하고 제거하는 것은 불가능합니다. 수행하려는 각 배열 작업에 대해 별도로 저장을 호출해야 합니다.
7 - ParseObject에서 단일 필드 제거하기
다음의 remove 작업을 사용하여 객체에서 단일 필드를 삭제할 수 있습니다:
1 ParseObject parseObject = new ParseObject("DataTypes");
2 parseObject.remove("stringField");
3 parseObject.save();완료되었습니다!
이 시점에서 우리는 Parse 데이터 유형에 대해 배웠습니다 안드로이드.