Fix relations in offline editing

This commit is contained in:
Matthias Kuhn 2017-02-22 10:37:27 +01:00
parent 86c0a16e9e
commit de966e2575
2 changed files with 30 additions and 0 deletions

View File

@ -254,6 +254,7 @@ void QgsOfflineEditing::synchronize()
// copy style
copySymbology( offlineLayer, remoteLayer );
updateRelations( offlineLayer, remoteLayer );
// apply layer edit log
QString qgisLayerId = layer->id();
@ -611,6 +612,7 @@ QgsVectorLayer* QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlit
}
}
updateRelations( layer, newLayer );
// copy features
newLayer->startEditing();
QgsFeature f;
@ -898,6 +900,29 @@ void QgsOfflineEditing::copySymbology( QgsVectorLayer* sourceLayer, QgsVectorLay
}
}
void QgsOfflineEditing::updateRelations( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer )
{
QgsRelationManager* relationManager = QgsProject::instance()->relationManager();
QList<QgsRelation> relations;
relations = relationManager->referencedRelations( sourceLayer );
Q_FOREACH ( QgsRelation relation, relations )
{
relationManager->removeRelation( relation );
relation.setReferencedLayer( targetLayer->id() );
relationManager->addRelation( relation );
}
relations = relationManager->referencingRelations( sourceLayer );
Q_FOREACH ( QgsRelation relation, relations )
{
relationManager->removeRelation( relation );
relation.setReferencingLayer( targetLayer->id() );
relationManager->addRelation( relation );
}
}
// NOTE: use this to map column indices in case the remote geometry column is not last
QMap<int, int> QgsOfflineEditing::attributeLookup( QgsVectorLayer* offlineLayer, QgsVectorLayer* remoteLayer )
{

View File

@ -108,6 +108,11 @@ class CORE_EXPORT QgsOfflineEditing : public QObject
void applyGeometryChanges( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId, int commitNo );
void updateFidLookup( QgsVectorLayer* remoteLayer, sqlite3* db, int layerId );
void copySymbology( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer );
/**
* Updates all relations that reference or are referenced by the source layer to the targetLayer.
*/
void updateRelations( QgsVectorLayer* sourceLayer, QgsVectorLayer* targetLayer );
QMap<int, int> attributeLookup( QgsVectorLayer* offlineLayer, QgsVectorLayer* remoteLayer );
void showWarning( const QString& message );