-
Meet CKTool JS
Discover how you can manage and automate your iCloud containers using CKTool JS. We'll show you how to configure CKTool JS to manage your containers' schemas, modify records with ease, and manipulate data on the fly. We'll also explore how you can integrate CKTool JS into your automation and tooling workflows.
To get the most out of this session, we recommend familiarity with CloudKit schemas, JavaScript, and npm.Recursos
Vídeos relacionados
WWDC22
WWDC21
-
Buscar neste vídeo...
-
-
6:43 - Create security and default arguments objects
// Create security object and setup default args const { CKEnvironment } = require("@apple/cktool.database"); const security = { "ManagementTokenAuth": "<YOUR_MANAGEMENT_TOKEN>", "UserTokenAuth": "<YOUR_USER_TOKEN>" }; const defaultArgs = { "teamId": "<YOUR_TEAM_ID>", "containerId": "<YOUR_CONTAINER_ID>", "environment": CKEnvironment.DEVELOPMENT }; -
7:17 - Create configuration and API objects
// Create configuration and API objects const { createConfiguration } = require("@apple/cktool.target.nodejs"); const { PromisesApi } = require("@apple/cktool.database"); const configuration = createConfiguration(); const api = new PromisesApi({ "configuration": configuration, "security": security }); -
10:00 - Reset to production and import schema
// Create a function to apply a schema const { File } = require("@apple/cktool.target.nodejs"); const fs = require("fs/promises"); const path = require("path"); const importMySchema = async () => { const schemaPath = "<YOUR_SCHEMA_FILE>.ckdb"; const buffer = await fs.readFile(schemaPath); const file = new File([buffer], schemaPath); await api.importSchema({ ...defaultArgs, "file": file }); } // Chain the calls api.resetToProduction(defaultArgs) .then(() => importMySchema()); -
11:36 - Factory functions
// Create fields with factory functions. const { makeRecordFieldValue } = require("@apple/cktool.database"); const value = makeRecordFieldValue.int64(2007); -
12:02 - Create database arguments object
// Create a database arguments object. const { CKDatabaseType, CKEnvironment } = require("@apple/cktool.database"); const databaseArgs = { "containerID": "<YOUR_CONTAINER_ID>", "environment": CKEnvironment.DEVELOPMENT, "databaseType": CKDatabaseType.PRIVATE, "zoneName": "_defaultZone" }; -
12:16 - Query for records
// Define helper function for querying records const { CKDBQueryFilterType } = require("@apple/cktool.database"); const countryQueryRecordForCountryCode3 = async (countryCode3) => { const response = await api.queryRecords({ ...databaseArgs, "body": { "query": { "recordType": "Countries", "filters": [{ "fieldName": "isoCode3", "fieldValue": makeRecordFieldValue.string(countryCode3), "type": CKDBQueryFilterType.EQUALS }] } } }); return response.result.records[0]; } -
12:58 - Create field values
// Define a helper function for creating field values const { makeRecordFieldValue, CKDBRecordReferenceAction } = require("@apple/cktool.database"); const makeCoinFieldValues = ({ countryRecordName, issueYear, nominalValue }) => ({ "country": makeRecordFieldValue.reference({ recordName: countryRecordName, action: CKDBRecordReferenceAction.DELETE_SELF }), "issueYear": makeRecordFieldValue.int64(issueYear), "nominalValue": makeRecordFieldValue.double(nominalValue) }); -
13:26 - Create a record
// Define helper method for creating coins const coinCreateRecord = async (fields) => { const response = await api.createRecord({ ...databaseArgs, "body": { "recordType": "Coins", "fields": fields }, }); return response.result.record; } -
13:48 - Call record creation helper method
// Call coin creation method with field values const countryRecord = await countryQueryRecordForCountryCode3("USA"); const coinRecord1 = await coinCreateRecord( makeCoinFieldValues({ "countryRecordName": countryRecord.recordName, "issueYear": 2007, "nominalValue": 0.10 }) ); -
14:16 - Define update record helper function
// Define helper method for updating coins. // Note that recordChangeTag is required const coinUpdate = async (recordName, recordChangeTag, fields) => { const response = await api.updateRecord({ ...databaseArgs, "recordName": recordName, "body": { "recordType": "Coins", "recordChangeTag": recordChangeTag, "fields": fields } }); return response.result.record; } -
14:44 - Update a record with field values
// Call coin updating method with field values. // Note that the recordChangeTag of the record // to update is passed to the coin update function. const countryRecord = await countryQueryRecordForCountryCode3("USA"); const updatedCoinRecord1 = await coinUpdate( coinRecord1.recordName, coinRecord1.recordChangeTag, makeCoinFieldValues({ "countryRecordName": countryRecord.recordName, "issueYear": 2010, "nominalValue": 0.10 }); ); -
14:57 - Delete a record
// Deleting a record await api.deleteRecord({ ...databaseArgs, "recordName": coinRecord1.recordName });
-