Use branch versioned data (a type of enterprise geodatabase versioning) when you want to provide multiuser editing in a service-oriented architecture (through feature services) and your users don't need direct access to the geodatabase. To compare versioning types, see Versioning types in the ArcGIS Pro documentation.
To use branch versioning in your app:
- Set up and share your data as described in the Set up and share versioned data section.
- Bring your data into the app using the
AGSServiceGeodatabase
class, as described in the Work with branch versions section.
Branched versioned data can be edited offline the same way you edit feature services offline or use individual layers offline, as described in the Edit data from a branch version section.
Why use branch versioning
With branch versioning, editors can work within their own personal version of a geodatabase so that other users don't see incomplete work and editors don't block one another from accessing the data. Each version can represent ongoing work, such as a design or a group of work orders, work that can span multiple sessions and extend over a period of weeks or months if necessary.
Some common workflows for using branch versioned datasets include:
- Multiuser editing, such as individual field crews working in their own branches
- Modeling a variety of outcomes, with each scenario represented in its own branch
- Editing and tracking different phases of a project
Set up and share versioned data
If you require multiple editors concurrently accessing services with the ability to work with their own set of edits, you must first register your data as branch versioned. When you share that dataset as a service, you have the option to enable the Version Management capability at the time of publishing, which allows for the creation and management of versions. For more information about setting up a database with branch versioning, see Register a dataset as branch versioned in the ArcGIS Pro documentation.
To edit branch versioned data, you must access it through a feature service. After registering data as branch versioned, publish the data to your organization's ArcGIS Enterprise portal as a web feature layer. Be sure you publish a layer that references registered data. The data will then be available as a feature service and you can edit it as part of your branch versioning workflows. For more information about how to share branch versioned data, see ArcGIS Pro help's Share branch versioned data.
Work with branch versions
In ArcGIS Runtime, use the
AGSServiceGeodatabase
class to represent a hosted geodatabase. You can create an instance of the class by providing the service URI and optionally the version name. You can also read the service geodatabase property from a service feature table.
A
AGSServiceFeatureTable
will have an associated
AGSServiceGeodatabase
if the feature table was loaded from a web map or if it was created from a service geodatabase (using
AGSServiceGeodatabase.tableWithLayerID()
). A standalone service feature table, created using any of the constructors, will not have access to a service geodatabase.
Use
AGSServiceGeodatabase.fetchVersionsWithCompletion:
to get information about the versions a service geodatabase contains that the current user has access to. The information includes the name, description, access level (private, protected, or public), creation date, and so on. You can create a new version by providing a name, description, and access level. You can access public and protected versions, and private versions you own. You cannot see information about, or connect to, private versions owned by other users.
The following steps show some common tasks when working with versions in a service geodatabase. These include getting the service geodatabase used by a feature layer, getting information about the current version, creating a new version, and switching the version used by the geodatabase to the new one.
-
Get the service feature table from the feature layer in the map.
Use dark colors for code blocks Copy // Obtain the service feature table from the layer. self.serviceFeatureTable = self.featureLayer.featureTable as? AGSServiceFeatureTable
-
Get the service geodatabase from the service feature table. Make sure the service geodatabase is loaded. Loading the service feature table will also load its service geodatabase.
Use dark colors for code blocks Copy // Load the service feature table. self.serviceFeatureTable.load {[weak self] error in guard let self = self else {return} if let error = error { print(error) return } // Get the service geodatabase from the service feature table. if let serviceGeodatabase = self.serviceFeatureTable.serviceGeodatabase { self.serviceGeodatabase = serviceGeodatabase self.serviceGeodatabase.load { error in guard error == nil else { print("Could not load the service geodatabase \(error!.localizedDescription)") return } }
-
See if the service geodatabase supports branch versioning. If it does, get a list of its versions and information about the current version.
Use dark colors for code blocks Copy // Check that the geodatabase supports branch versioning. if self.serviceGeodatabase.supportsBranchVersioning { // Get the service geodatabase's versions. self.serviceGeodatabase.fetchVersions(completion: {[weak self] versions, error in guard let self = self else {return} guard error == nil else { print("Could not obtain the versions \(error!.localizedDescription)") return } if let currentVersionInfo = versions!.first(where: { $0.name < self.serviceGeodatabase.versionName }) { print("The current geodatabase version is \(currentVersionInfo.name)") }
-
Create service version parameters that define properties for a new version: a name, description, and access level.
Use dark colors for code blocks Copy // Create service version parameters to define a new private version. // The .name value must be unique to the geodatabase, otherwise the // createVersion method will fail. let versionParams = AGSServiceVersionParameters() versionParams.access = .private versionParams.name = "ProvideAUniqueName" versionParams.parametersDescription = "A new design"
-
Pass the parameters to the service geodatabase to create a new version. Then switch the current version of the database to the new one.
Use dark colors for code blocks Copy // Create a new version of the service geodatabase. self.serviceGeodatabase.createVersion(with: versionParams) {[weak self] serviceVersionInfo, error in guard let self = self else {return} if let error = error { print("Error \(error)") return } if let serviceVersionInfo = serviceVersionInfo { // Switch the service geodatabase to this new version. self.serviceGeodatabase.switchVersion(withName: serviceVersionInfo.name, completion: { error in if let error = error { print("Error \(error.localizedDescription)") return } print("The new geodatabase version is \(self.serviceGeodatabase.versionName)") }) }
Edit data from a branch version
Edits can be made to service feature tables from a branch version in the same way they are made to any
AGSServiceFeatureTable
. You can use the same workflow described in the Edit topic. Within that standard workflow, the
AGSServiceGeodatabase
class provides some additional members for managing edits. For example, all local edits (to all tables in the version) can be applied by calling
AGSServiceGeodatabase.applyEditsWithCompletion:
and you can undo all edits with
AGSServiceGeodatabase.undoLocalEditsWithCompletion:
. Reconciling and posting versions are back-office operations that should be performed with ArcGIS Pro or other enterprise processes.
-
Make edits to the service feature tables, such as adding, deleting, or updating features. Edits to attachments and adding or removing relates can also be managed by the service geodatabase. See Perform Edits for more information about how to perform these feature edits.
Use dark colors for code blocks Copy // Create a new feature and define its geometry and attributes. let newFeature = self.serviceFeatureTable.createFeature() newFeature.geometry = AGSPoint(x: 1036000, y: 1860000, spatialReference:self.serviceFeatureTable.spatialReference) newFeature.attributes["pstlcity"] = "London" // Add the new feature to the local table. self.serviceFeatureTable.add(newFeature) {(error: Error?) in if let error = error { print("Error", error) } } // Use a query to return specific features. let queryParams = AGSQueryParameters() queryParams.whereClause = "pstlcity = 'London'" self.serviceFeatureTable.queryFeatures(with: queryParams) { [weak self] (result, error) in guard let self = self else { return } if let error = error { print(error.localizedDescription) } if let features = result?.featureEnumerator().allObjects { if !features.isEmpty { // Delete these features. self.serviceFeatureTable.delete(features) { (error: Error?) in if let error = error { print("Error while deleting features : \(error.localizedDescription)") } } } } }
-
Service feature table edits only affect the local datasets unless they are explicitly applied to the service. Before applying your local edits, you may want to examine the connected tables for a service geodatabase to see which tables it manages. When loading a web map, the service geodatabase's connected tables will consist of all tables in the map from the same feature service. Accessing a table from the service geodatabase (using
AGSServiceGeodatabase.tableWithLayerID()
) will also add that table to the collection of connected tables.Use dark colors for code blocks Copy // Obtain an array of tables managed by the service geodatabase. let connectedTables = self.serviceGeodatabase.connectedTables
-
You can use
has
on the service geodatabase to see if there are unsaved edits in any of the connected tables. You can then useLocal Edits() apply
on the service geodatabase to send all edits to the service in a single transaction. This ensures that geodatabase behavior is appropriately leveraged.Edits() Use dark colors for code blocks Copy // Check if the service geodatabase has any local edits? if self.serviceGeodatabase.hasLocalEdits() { // Apply edits to the service for all of the tables in the service // geodatabase to ensure that the 'database behavior' is honored. self.serviceGeodatabase.applyEdits {(featureTableEditResults: [AGSFeatureTableEditResult]?, error: Error?) in if let error = error { print("Error while applying edits :: \(error.localizedDescription)") } } }
The advantage of calling
AGSServiceGeodatabase.applyEditsWithCompletion:
on the service geodatabase, rather than on each individual table, is that it ensures that all of the edit operations take place in a single transaction. Either all of the edits are applied or none of them. If you apply edits on each table individually, it is possible that only some edits will be applied (for example, if you lose network connectivity in the middle of the operation). -
To undo local edits in the connected tables, use
undo
on the service geodatabase.Local Edits() Use dark colors for code blocks Copy // Undo the local edits for all the tables in the service geodatabase. self.serviceGeodatabase.undoLocalEdits {(error) in if let error = error { print("Error while undoing edits :: \(error.localizedDescription)") } }