Interact with table data in a ServiceNow instance

  • Release version: Zurich
  • Updated July 31, 2025
  • 4 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Interact with table data in a ServiceNow instance

    The Mobile SDK for ServiceNow enables you to interact with table data in your ServiceNow instance using two main APIs:NowTableServiceandNowGraphQLService. These APIs allow authorized users to perform CRUD (Create, Read, Update, Delete) operations on records within ServiceNow tables. The choice between these services depends on your need to query single or multiple tables and your preference for REST or GraphQL interfaces.

    Show full answer Show less

    NowGraphQLService for Table Interaction

    The NowGraphQLService class lets you construct and execute GraphQL queries against your ServiceNow instance. This is particularly useful if you want to retrieve data from multiple tables in a single call. It supports all CRUD operations defined within GraphQL queries and offers multiple ways to fetch results:

    • Completion handler callback
    • Async/await syntax
    • Deprecated Combine publisher

    Example workflows include initializing the service using makeGraphQLService(instanceUrl:completion:) and asynchronously fetching data such as recently published knowledge base articles with a well-defined GraphQL query.

    NowTableService for Table Interaction

    The NowTableService class provides direct access to records in any authorized ServiceNow table through the REST Table API. It supports dot-walking to access reference fields (e.g., retrieving a user’s name via user.name). All data returned respects Access Control Lists (ACLs), ensuring compliance with security and authorization rules.

    This service offers three patterns to handle results:

    • Async/await methods
    • Completion handlers with Result enumerations
    • Deprecated Combine publishers

    CRUD methods come in two variants: those returning raw data and those returning strongly typed Codable models, with Codable models providing more flexibility and type safety.

    You initialize the service with makeTableService(instanceUrl:completion:) and then use it to perform operations such as creating, updating, or querying records.

    Practical Implications for ServiceNow Customers

    • Use NowTableService when you need straightforward CRUD operations on single tables with strong support for field-level data and ACL enforcement.
    • Use NowGraphQLService when querying across multiple tables or when leveraging GraphQL’s query flexibility is advantageous.
    • Both services require proper user authorization to access or modify data, ensuring security compliance.
    • The SDK supports modern Swift concurrency with async/await, facilitating integration into contemporary iOS applications.
    • Deprecated Combine publisher methods are available but should be avoided in new development.

    These capabilities empower ServiceNow customers to build mobile and custom applications that interact efficiently and securely with their ServiceNow data, improving workflow automation and user experience.

    The Mobile SDK enables you to interact with data in tables that reside on your ServiceNow instance. You can interact with this data through the ServiceNow REST Table API using the NowTableService() API that directly calls the REST interface, or through the NowGraphQLService() API that executes a specified GraphQL query against the REST GraphQL API.

    If you want to return data from multiple tables within a single call, you will need to use the NowGraphQLService() API. If you need to interact with other ServiceNow REST APIs, see Interact with the public REST API on a ServiceNow instance.

    Using NowGraphQLService to interact with ServiceNow tables

    The NowGraphQLService class provides methods that enable you to construct and execute GraphQL queries on a specified table within your ServiceNow instance if the logged in user has the proper authorization. You can define all CRUD operations within your GraphQL query.

    NowGraphQLService supports fetching results for a query by returning a completion handler:
    func execute(_ query: GraphQLQuery, completion: @escaping (Result<Data, NowDataError>) → Void)
    Through async/await:
    func execute(_ query: GraphQLQuery) async throws -> Data
    Or, a Combine publisher (which is currently deprecated):
    func publisher(for query: GraphQlQuery) → AnyPublisher<Data, NowDataError>
    
    The following example shows how to import the NowData framework and then initialize a NowGraphQLService object that you can then use to interact with tables in your ServiceNow instance.
    // Import the NowData framework
    import NowData
    
    // Initialize a NowGraphQLService
    // The makeGraphQLService completion handler returns a result that wraps 
    // the NowGraphQLService upon success or error. 
    
    private func initializeGraphQLService(instanceUrl: URL) {
      makeGraphQLService(instanceUrl: instanceUrl) { [weak self] result in
        switch result {
        case .success(let service):
          self?.graphQLService = service
        case .failure(let error):
          debugPrint("Creating GraphQL service failed with error: \(error.localizedDescription)")
          self?.graphQLService = nil
        }
      }
    }
    This example shows how to create an async function that fetches and publishes the most recently published KB articles.
    private func fetchArticles() async throws -> [Article] { 
        guard let graphQLService = graphQLService else { 
            throw ArticleListError.invalidGraphQLService 
        }         
    
        do {
            let data = try await graphQLService.execute(GraphQLQuery(query: recentlyPublishedQuery))
            let articles = try dataToArticleList(data)
        } catch let error as NowDataError {
            throw ArticleListError.fetchError(error)
        } catch {
            throw error
        }
    } 
      
    private let recentlyPublishedQuery = 
    """ 
    
    {
      GlideRecord_Query {
        kb_knowledge(queryConditions: "active=true^ORDERBYpublishedDESC" pagination: { limit: 10, offset: 0 }) {
          _results { 
            sys_id {
              value
            },
            number {
              displayValue
            },
            short_description {
              displayValue
            },
            author {
              displayValue
            }
            published {
              displayValue
            }
          }
        }
      }
    }
    """

    Using NowTableService to interact with ServiceNow tables

    The NowTableService class provides methods to perform CRUD operations on the records in tables that reside on your ServiceNow instance. Through this interface you can directly access any of the records within any ServiceNow table for which the logged in user is authorized. NowTableService supports dot-walking for reference fields. For example, if a table contains a reference to the User table, the dot-walked value user.name returns the name of the user.

    When returning the requested data, all applicable Access Control Lists (ACLs) are applied to the data, which may result in fewer results than expected, or authorization errors if the authenticated user does not have access rights to the specified table.

    Most NowTableService methods provide three implementations for returning results data. One that uses async/await, one that calls a completion handler with a Result enumeration, and one that returns a Combine publisher, which is currently deprecated.

    For example, all createRecord() methods insert a constructed record into a specified table, however, the

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions, configuration: FieldReadConfiguration, completion: @escaping (Result<Data, NowDataError>)

    method calls a completion handler with a Result enumeration (the .success case contains the results as its associated value).

    The

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions? = nil, configuration: FieldReadConfiguration? = nil) async throws

    method performs an async/await function. While the

    NowTableService - createRecord(with fields: [FieldName: FieldValue], in tableName: String, writeOptions: FieldWriteOptions? = nil, configuration: FieldReadConfiguration? = nil)

    method returns a Combine publisher, but is currently deprecated.

    In addition, NowTableService provides two different implementations of CRUD methods, one that returns raw data, and one that returns Codable models. For example, both the update() and updateRecord() methods update a specified record in a specified table, but the update() methods return a Codable model and the updateRecord() methods return raw data. In some cases, Codable methods might be preferable, as a strongly typed Codable structure provides more flexibility than a collection of raw data fields.

    The following example shows how to import the NowData framework and then initialize a NowTableService object that you can then use to interact with ServiceNow instance tables.
    // Import the NowData framework
    import NowData
    
    // Initialize a NowTableService
    // The makeTableService completion handler returns a result that wraps 
    // the NowTableService upon success or error. 
    
    makeTableService(instanceUrl: instanceUrl) { [weak self] result in
      guard let self = self else { return }
      
      switch result {
      case .success(let tableService):
        debugPrint("Successfully created a table service \(tableService)")
        self.tableService = tableService
      case .failure(let error):
        debugPrint("Creating table service failed with error: \(error.localizedDescription)")
      }
    }

    For additional code examples using the available NowTableService methods, refer to the NowTableService class - iOS API documentation.