Model Terhitung

Model terhitung adalah model virtual. Model ini dibuat dengan memproses data dari model lain atau resource eksternal. Data diproses dan disimpan di klien atau server App Maker, bukan dalam database.

Model terhitung dapat melakukan hal berikut:

  • mensintesis laporan kustom dari data model lain
  • mendapatkan data dari layanan web eksternal

Jenis model terhitung

App Maker memiliki tiga jenis model terhitung:

  • SQL terhitung: Model ini menggunakan kueri SQL ke database Cloud SQL aplikasi untuk mengisi record-nya. Pelajari model terhitung SQL lebih lanjut.
  • Terhitung: Model ini menggunakan skrip kueri sisi server yang menjalankan beberapa logika dan menampilkan array record. Pelajari Skrip kueri dan contoh lebih lanjut.
  • Terhitung sisi klien: Model ini menggunakan skrip kueri sisi klien untuk mengambil data secara bersamaan atau menggunakan callback untuk menampilkan hasil yang tidak bersamaan.

Model terhitung sisi klien

Model terhitung sisi klien menggunakan skrip kueri kustom yang berjalan, bukan kueri sumber data normal, yang meneruskan setiap filter dari parameter kueri.

Untuk menggunakan skrip kueri kustom:

  1. Buka tab Sumber data dari model terhitung sisi klien.
  2. Di kotak kode Kueri, masukkan skrip kueri kustom Anda. Skrip Anda harus menyertakan pernyataan pengembalian.
  3. Untuk merender data yang diambil dari layanan pihak ketiga:
    1. Petakan kueri skrip Anda dengan kueri API pihak ketiga.
    2. Petakan data yang ditampilkan ke record model.

Model mana yang harus Anda gunakan?

Lihat tabel berikut dan batasan model terhitung untuk menentukan jenis model terbaik yang akan digunakan.

Sasaran Model yang akan digunakan
Mengubah struktur data dari model di aplikasi Anda. Model SQL Terhitung atau Terhitung (sisi server).

Jika model terhitung Anda menggunakan banyak kolom yang sama dengan model yang ada, gunakan sumber data kueri, bukan model terhitung sisi server. Sumber data kueri biasanya lebih sederhana.

Mengambil data menggunakan API dan library sisi klien. Model terhitung sisi klien

Dengan model ini, Anda bisa mendapatkan data menggunakan Google API atau layanan pihak ketiga, seperti Facebook SDK atau SalesForce API.

Menampilkan komponen aplikasi dengan cepat, seperti diagram dan menu dinamis, tanpa membuat kueri ke server. Model terhitung sisi klien

Batasan

Batasan model terhitung sisi server:

  • Record-nya tidak dapat diubah atau dihapus (record bersifat hanya baca).
  • Record-nya tidak dapat dibuat di klien.
  • Model ini tidak dapat memiliki relasi dengan model App Maker lainnya, termasuk dengan model ini sendiri.
  • Kueri model SQL terhitung tidak tunduk pada batasan keamanan yang ditetapkan untuk model yang dibuat kuerinya. Tetapkan batasan keamanan untuk model SQL terhitung itu sendiri di tab Keamanan.

Batasan model terhitung sisi klien:

  • Record-nya tidak dapat diubah atau dihapus (record bersifat hanya baca).
  • Model ini tidak dapat memiliki relasi dengan model App Maker lainnya, termasuk dengan model ini sendiri.
  • Model ini mendukung konfigurasi paging atau pengurutan.
  • Model ini tidak mendukung peristiwa atau konfigurasi keamanan.
  • Error ditampilkan jika hasil ditampilkan lebih dari satu kali, misalnya panggilan callback ganda atau panggilan callback dan pengembalian.

Contoh model terhitung

Model SQL terhitung

Untuk contoh model SQL terhitung, lihat Cloud SQL.

Skrip kueri sisi server

Skrip kueri berikut menggunakan kolom Location pada model Employee untuk menghitung jumlah karyawan di setiap lokasi:

var calculatedModelRecords = [];
var recordsByLocation = {};
var allEmployees = app.models.Employee.newQuery().run();
for (var i = 0; i < allEmployees.length; i++) {
  var employee = allEmployees[i];
  if (!recordsByLocation[employee.Location]) {
    var calculatedModelRecord = app.models.EmployeesByLocation.newRecord();
    calculatedModelRecord.NumberOfEmployees = 1;
    calculatedModelRecord.Location = employee.Location;
    calculatedModelRecords.push(calculatedModelRecord);
    recordsByLocation[employee.Location] = calculatedModelRecord;
  } else {
    recordsByLocation[employee.Location].NumberOfEmployees++;
  }
}
return calculatedModelRecords;

Skrip ini diulang di setiap record dalam model Employee dan melakukan tindakan berikut:

  1. Membuat record untuk setiap lokasi baru yang ditemukannya.
  2. Menambah jumlah karyawan untuk setiap record dengan lokasi berulang.

Skrip ini membuat record model terhitung menggunakan newRecord(), tetapi metode ini tidak benar-benar membuat record dalam backend data. Sebaliknya, model menampilkan record ke klien secara langsung.

Untuk contoh lainnya, lihat Skrip kueri.

Model terhitung sisi klien

Contoh 1: Kueri bersamaan App Maker Client API

Skrip berikut menampilkan barisan Fibonacci. Operasi App Maker lainnya menunggu hasilnya sebelum melanjutkan.

  var limit = 10;
  var result = [];
  for (var i=0; i < limit; i++) {
    var record =  recordFactory.create();
    if (i < 2) {
      record.Value = 1;
    } else {
      record.Value = result[i-1].Value + result[i-2].Value;
    }
    result.push(record);
  }
  return result;

Contoh 2: Permintaan bersamaan ke API pihak ketiga

Skrip berikut menggunakan Google Books API untuk menelusuri buku yang cocok dengan input pengguna (SearchString) dan menampilkan hasilnya dengan fungsi callback.

// Note: Include JQuery library for the application
// Search for a book matching the user's search string
var searchString = query.parameters.SearchString;
$.getJSON('https://www.googleapis.com/books/v1/volumes?q=' + encodeURI(searchString), function(result){
  var records = result.items.map(function(bookData){
    // Create a record from the book's data
    var record = recordFactory.create();
    record.Title = bookData.volumeInfo.title || null;
    return record;
  });
  // Return results
  callback.success(records);
});

Contoh 3: Kueri bersamaan App Maker Client API dengan fungsi callback yang berhasil dan gagal

Skrip berikut menampilkan hasil secara bersamaan ketika hasil tidak langsung dibutuhkan.

  externalApi.execute(function(results) {
    if (results.length) {
      сallback.success(mapResultsToRecords(results));
    } else {
      сallback.failure(‘No results were found');
    }
  });