Helpex - Trao đổi & giúp đỡ Đăng nhập

Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhất

Hoàng Vạn Lý
· 17:00 21/10/2018
4 ngày trước

Trong bài viết này, tôi sẽ mô tả cách sử dụng Backendless API để lưu nhiều bản ghi có liên quan với một bản ghi chính (mẹ) trong một bảng. Tất cả các bản ghi liên quan (con) sẽ được lưu trữ trong các bảng riêng biệt như một phần của cùng một thói quen.

Ví dụ về loại yêu cầu này có thể là hồ sơ nhân sự được gắn với một mã định danh duy nhất (chẳng hạn như số nhân viên) hoặc bản kê khai vận chuyển được gắn với một bộ định vị hồ sơ duy nhất.

Chuẩn bị: Cấu hình bảng

Đối với ví dụ này, tôi sẽ sử dụng một cấu trúc đơn giản với tên của một người làm loại bản ghi chính và thông tin liên quan của họ sẽ được lưu trong một bảng khác.

Tạo các bảng được yêu cầu với các lược đồ được hiển thị bên dưới hoặc nếu muốn, bạn có thể tăng tốc mọi thứ bằng cách sử dụng liên kết này để có được một lược đồ cơ sở dữ liệu được chuẩn bị trước:

Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhấtBảng Person: Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhấtBảng Địa chỉ: Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhấtBảng Medical_info: Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhấtBảng Điện thoại: Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhấtTạo Dịch vụ Tùy chỉnh

Bây giờ, tôi sẽ tạo một dịch vụ sẽ thực hiện tất cả các công việc thường ngày liên quan đến việc lưu toàn bộ mô hình dữ liệu:

Bước 1. Tải xuống CodeRunner và Model Class.

Đầu tiên, hãy tải xuống CodeRunner. Nếu bạn không quen thuộc với CodeRunner hoặc logic nghiệp vụ máy chủ, bạn có thể xem tổng quan.

Nhấp vào biểu tượng Business Logic trong Backendless Console và sau đó nhấp vào tab XỬ LÝ SỰ KIỆN , và Tải xuống để chọn JAVA:

Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhất

Quá trình tải xuống sẽ bắt đầu, cung cấp tệp lưu trữ có tên "Your_appname_JAVA_default_coding.zip". Tiếp theo, chúng ta cần các lớp Java cho mô hình bảng của chúng ta. Ở bên trái màn hình của bạn, nhấp vào Tạo mã và chọn danh mục Android và " Các lớp Java cho bảng dữ liệu đã xác định ":

Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhất

Tiếp theo, nhấp vào nút GENERATE để tạo và tải xuống mã. Bạn sẽ thấy đoạn mã tải xuống dưới dạng tệp lưu trữ ".zip" thứ hai, có tên "AppName-Data-generated.zip".

Bước 2. Tạo một dự án mới

Sau khi tải xuống các tệp, bạn cần giải nén tệp nén zip có chứa CodeRunner (tệp nén đầu tiên bạn tải xuống) và để mở tệp đó dưới dạng một dự án trong “IntelliJ IDEA”.

Giải nén và mở tệp lưu trữ thứ hai, sau đó bắt đầu từ  src thư mục, đi sâu vào  data thư mục như hình dưới đây. Đặt gói  data trong  com. <app_name>  gói trong dự án đã mở.

Sau đó, tạo một lớp Java  SaveObjectModel trong gói  services. Bước 4 dưới đây bao gồm  SaveObjectModel danh sách lớp học.

Nếu bạn muốn sử dụng danh sách mã nguồn đóng gói sẵn, bạn có thể tải xuống từ đây . Nội dung CodeRunner từ tệp zip được chuẩn bị trước trông như thể hiện trong ảnh chụp màn hình bên dưới. Nếu bạn quyết định sử dụng mã đóng gói sẵn, bạn có thể chuyển sang bước 5.

Làm thế nào để lưu một đối tượng với tất cả trẻ em trong một cuộc gọi không phụ thuộc duy nhất

Bước 3. Tạo lớp Bootstrap

Tôi khuyên bạn nên đổi tên các lớp để thuận tiện và tạo ánh xạ dữ liệu đặc biệt giữa các lớp và bảng mà chúng đại diện trong Bootstraplớp:

import com.backendless.Backendless;
import com.backendless.servercode.IBackendlessBootstrap;
import com.examples.testapp3.data.Address;
import com.examples.testapp3.data.MedicalInfo;
import com.examples.testapp3.data.Person;
import com.examples.testapp3.data.Phone;

public class Bootstrap implements IBackendlessBootstrap
{
 @Override
 public void onStart()
 {
   Backendless.Persistence.mapTableToClass( "person", Person.class );
   Backendless.Persistence.mapTableToClass( "address", Address.class );
   Backendless.Persistence.mapTableToClass( "phone", Phone.class );
   Backendless.Persistence.mapTableToClass( "medical_info", MedicalInfo.class );
   // add your code here
 }

 @Override
 public void onStop()
 {
   // add your code here
 }
}

Bước 4. Xác định Dịch vụ

Hãy chú ý đến các nhận xét trong mã nguồn SaveObjectModel sau:

import com.backendless.Backendless;
import com.backendless.IDataStore;
import com.backendless.servercode.BackendlessService;
import com.examples.testapp3.data.Address;
import com.examples.testapp3.data.MedicalInfo;
import com.examples.testapp3.data.Person;
import com.examples.testapp3.data.Phone;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@BackendlessService
public class SaveObjectModel
{
 public String saveServiceOrder( Person person )
 {
   if (person == null)
     return null;

   // temporary save all relations in local variables
   List<Address> addresses = person.getAddress();
   List<Phone> phones = person.getPhone();
   MedicalInfo medicalInfo = person.getMedical_info();

   // save the main object
   Person savedPerson = Backendless.Data.of( Person.class ).save( person );

   // Addresses
   if (addresses != null && !addresses.isEmpty())
   {
     List<Address> savedAddresses = new ArrayList<>();
     IDataStore<Address> addressDao = Backendless.Data.of( Address.class );
     addresses.forEach( addr -> savedAddresses.add( addressDao.save( addr ) ) );

     // create relation for addresses
     Backendless.Data.of( Person.class ).setRelation( savedPerson, "address", savedAddresses );
   }

   // Phones
   if (phones != null && !phones.isEmpty())
   {
     List<Phone> savedPhones = new ArrayList<>();
     IDataStore<Phone> phoneDao = Backendless.Data.of( Phone.class );
     phones.forEach( phone -> savedPhones.add( phoneDao.save( phone ) ) );

     // create relation for addresses
     Backendless.Data.of( Person.class ).setRelation( savedPerson, "phone", savedPhones );
   }

   // MedicalInfo
   if (medicalInfo != null)
   {
     MedicalInfo savedMedicalInfo = Backendless.Data.of( MedicalInfo.class ).save( medicalInfo );

     // create relation for addresses
     // here we need to wrap single value in singleton List, because the relation is ONE-TO-ONE
     Backendless.Data.of( Person.class ).setRelation( savedPerson, "medical_info", Collections.singletonList( savedMedicalInfo ) );
   }

   return person.getObjectId();
 }
}

Bước 5. Triển khai Dịch vụ

Sau khi xây dựng dự án, hãy chạy tập lệnh sau <your_project>/bin/Deploy.sh để triển khai dịch vụ tới máy chủ Backendless. Khi dịch vụ được triển khai, bạn có thể nhìn thấy nó và chạy các lệnh gọi kiểm tra các phương thức của nó bằng cách sử dụng Backendless Console. Để làm điều đó, hãy đăng nhập vào tài khoản Backendless của bạn , chọn ứng dụng và nhấp vào biểu tượng Business Logic . Tab DỊCH VỤ API được chọn theo mặc định. Xác định vị trí dịch vụ của bạn, nhấp vào tên của nó và sau đó nhấp vào  saveServiceOrder phương pháp. Để chạy một lời gọi kiểm tra, hãy nhấp vào tab THÔNG SỐ . Dán đối tượng JSON được hiển thị bên dưới vào  body trường và nhấp vào nút INVOKE :

{
  "name": "Malkovich",
  "birthday": 506919600000,
  "gender": "male",
  "phone": [
    {
      "type": "mobile",
      "number": "(111)876-345-799"
    },
    {
      "type": "landline",
      "number": "(222)345-786-54"
    }
  ],
  "address": [
    {
      "city": "New York",
      "street": "North Avenue",
      "apartment": "07076",
      "building": "2A"
    },
    {
      "city": "Florida",
      "street": "South Avenue",
      "apartment": "321",
      "building": "34-789"
    }
  ],
  "medical_info": {
    "blood_type": "A+",
    "allergens": "anice"
  }
}

Khi phương pháp này được gọi, chuyển sang màn hình dữ liệu và kiểm tra các đối tượng được lưu trong  PersonAddressvà  Phone bảng.

Với cách tiếp cận được mô tả trong bài viết này, tất cả các công việc thường xuyên để lưu các mô hình dữ liệu đối tượng phức tạp vào nhiều bảng được đơn giản hóa, giảm công việc của ứng dụng thành một lệnh gọi API duy nhất.

Nếu bạn có bất kỳ câu hỏi nào về quy trình này, vui lòng đăng câu hỏi của bạn trong diễn đàn hỗ trợ của chúng tôi ( https://support.backendless.com ) hoặc trên Slack ( http://slack.backendless.com ).

8 hữu ích 0 bình luận 5.2k xem chia sẻ

Có thể bạn quan tâm