Connect to a service and list versions of the geodatabase.
Use case
As part of a multi-user editing scenario, you can check with the server to see how many versions of the geodatabase are outstanding before syncing.
How to use the sample
When the sample loads, a list of geodatabase versions and their properties will be displayed.
How it works
- Create a geoprocessing task referring to a GPServer with a ListVersions task.
- Use the task to create default parameters.
- Use the created parameters to create a job.
- Run the job to get a geoprocessing result.
- Get a list of geoprocessing features from the Versions output parameter of the results.
- Format the geodatabase versions for display.
Relevant API
- GeoprocessingFeatures
- GeoprocessingJob
- GeoprocessingParameters
- GeoprocessingResult
- GeoprocessingTask
About the data
The sample uses a sample geoprocessing service hosted on ArcGIS Online.
Additional information
ArcGIS Server does not include a geoprocessing service for listing geodatabase versions. You must configure one using the steps defined in Geoprocessing service example: list, create, and delete geodatabase versions in the ArcMap documentation.
Tags
conflict resolution, data management, database, multi-user, sync, version
Sample Code
// Copyright 2025 Esri
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import ArcGIS
import SwiftUI
struct ListGeodatabaseVersionsView: View {
/// The analysis error shown in the error alert.
@State private var analysisError: Error?
/// The task used to perform geoprocessing jobs.
@State private var geoprocessingTask = GeoprocessingTask(
url: URL(string: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/GDBVersions/GPServer/ListVersions")!
)
/// The geodatabase version information.
@State private var geodatabaseVersionInfos: [GeodatabaseVersionInfo]?
var body: some View {
Form {
if let geodatabaseVersionInfos {
ForEach(geodatabaseVersionInfos, id: \.objectID) { version in
Section("OBJECTID: \(version.objectID)") {
LabeledContent("Name", value: version.name)
.lineLimit(1)
.textSelection(.enabled)
LabeledContent("Access", value: version.access)
LabeledContent("Created", value: version.created.formatted(date: .abbreviated, time: .shortened))
LabeledContent("Last Modified", value: version.lastModified.formatted(date: .abbreviated, time: .shortened))
LabeledContent("Is Owner", value: version.isOwner)
LabeledContent("Parent Version", value: version.parentVersionName)
if !version.description.isEmpty {
LabeledContent("Description", value: version.description)
}
}
}
} else {
ProgressView()
.frame(maxWidth: .infinity)
}
}
.task {
do {
let resultFeatures = try await fetchGeodatabaseVersions()
geodatabaseVersionInfos = makeGeodatabaseVersionInfos(from: resultFeatures)
} catch {
analysisError = error
}
}
.errorAlert(presentingError: $analysisError)
}
/// Fetches geodatabase versions using a geoprocessing job.
private func fetchGeodatabaseVersions() async throws -> FeatureSet {
// Creates and configures the job's parameters.
let parameters = try await geoprocessingTask.makeDefaultParameters()
// Creates and starts the job.
let geoprocessingJob = geoprocessingTask.makeJob(parameters: parameters)
geoprocessingJob.start()
// Waits for the job to finish and retrieves the output.
let result = try await withTaskCancellationHandler {
try await geoprocessingJob.output
} onCancel: {
Task.detached {
await geoprocessingJob.cancel()
}
}
guard let versions = result.outputs["Versions"] as? GeoprocessingFeatures,
let featureSet = versions.features else {
fatalError("Expected geoprocessing results to contain 'Versions' output.")
}
return featureSet
}
/// Converts the features to an array of `GeodatabaseVersionInfo`.
/// - Parameter featureSet: The features with version info from the job.
/// - Returns: An array of `GeodatabaseVersionInfo`.
private func makeGeodatabaseVersionInfos(from featureSet: FeatureSet) -> [GeodatabaseVersionInfo] {
featureSet
.features()
.compactMap { version in
GeodatabaseVersionInfo(from: version.attributes)
}
.sorted {
$0.objectID < $1.objectID
}
}
/// A structure representing geodatabase version information.
private struct GeodatabaseVersionInfo {
let objectID: Int64
let name: String
let access: String
let created: Date
let lastModified: Date
let isOwner: String
let parentVersionName: String
let description: String
init?(from dictionary: [String: Sendable]) {
guard let access = dictionary["access"] as? String,
let created = dictionary["created"] as? Date,
let description = dictionary["description"] as? String,
let isOwner = dictionary["isowner"] as? String,
let lastModified = dictionary["lastmodified"] as? Date,
let name = dictionary["name"] as? String,
let objectID = dictionary["ObjectID"] as? Int64,
let parentVersionName = dictionary["parentversionname"] as? String else {
return nil
}
self.objectID = objectID
self.name = name
self.access = access
self.created = created
self.lastModified = lastModified
self.isOwner = isOwner
self.parentVersionName = parentVersionName
self.description = description
}
}
}