• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Code review for refreshToOneRelationshipWithKey
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Code review for refreshToOneRelationshipWithKey


  • Subject: Code review for refreshToOneRelationshipWithKey
  • From: Ricardo Parada <email@hidden>
  • Date: Sat, 03 Sep 2016 09:34:33 -0400

Hi all,

I have a need to refresh the to-one relationship of an object, so that if someone in another app or perhaps in a different EOF stack within the same app has updated the to-one to point to a different object then I want my EO’s to one to point to the correct EO.  I do not want to invalidate the source EO or refetch it because it may have edits in progress.

I searched in Wonder but I was not able to find anything that does this.  I came up with the code below last night and it seems to work well so far.  

Since this is an advanced EOF topic I thought I should share it to see if anybody wants to code review it, play with it and provide comments on correctness / recommendations / feedback.  

This code uses a primaryKeyQualifier() method in my EO which is practically the same as the identityQualifier() concept discussed by Aaron Rosenzweig in an email thread in May of this year.

Thanks in advance for any help.


    @SuppressWarnings("rawtypes")
    public void refreshToOneRelationshipWithKey(String toOneName) {
        EOEditingContext ec = editingContext();
        EOEntity entity = entity();
        EORelationship toOne = entity.relationshipNamed(toOneName);
        String foreignKeyName = toOne.sourceAttributes().lastObject().name();
        EOFetchSpecification fs = new EOFetchSpecification(entity.name(), primaryKeyQualifier(), null);
        fs.setRawRowKeyPaths(new NSArray<String>(foreignKeyName));
        @SuppressWarnings("unchecked")
        NSDictionary<String,Object> dict = (NSDictionary<String,Object>) ec.objectsWithFetchSpecification(fs).lastObject();
        Object newForeignKeyValue = dict.allValues().lastObject();
        EOGlobalID gid = globalID();
        EOModel model = entity.model();
        EODatabaseContext dbc = EODatabaseContext.registeredDatabaseContextForModel(model, ec);
        EODatabase database = dbc.database();
        EOObjectStoreCoordinator osc = (EOObjectStoreCoordinator) ec.rootObjectStore();
        osc.lock();
        try {
            NSDictionary snapshot = database.snapshotForGlobalID(gid);
            Object currentForeignKeyValue = snapshot.objectForKey(foreignKeyName);
            // We don't need to check for null as currentForeignKeyValue and newForeignKeyValue
            // use NSKeyValueCoding.NullValue to represent null.
            if (currentForeignKeyValue.equals(newForeignKeyValue) == false) {
                NSMutableDictionary newSnapshot = snapshot.mutableClone();
                newSnapshot.takeValueForKey(newForeignKeyValue, foreignKeyName);
                database.recordSnapshotForGlobalID(newSnapshot.immutableClone(), gid);
                Object toOneValue = NSKeyValueCoding.NullValue;
                if (newForeignKeyValue != NSKeyValueCoding.NullValue) {
                    EOKeyGlobalID toOneGID = ERXEOGlobalIDUtilities.createGlobalID(toOne.destinationEntity().name(), new Object[] {newForeignKeyValue});
                    toOneValue = ec.faultForGlobalID(toOneGID, ec);
                }
                // Update __originalSnapshot() and EO so that changesFromCommittedSnapshot()
                // does not think that the object has changed.
                NSDictionary originalSnapshot = __originalSnapshot();
                NSMutableDictionary newOriginalSnapshot = originalSnapshot.mutableClone();
                newOriginalSnapshot.setObjectForKey(toOneValue, toOneName);
                __setOriginalSnapshot(newOriginalSnapshot.immutableClone());
                if (toOneValue == NSKeyValueCoding.NullValue) {
                    takeStoredValueForKey(null, toOneName);
                } else {
                    takeStoredValueForKey(toOneValue, toOneName);
                }
            }
        } finally {
            osc.unlock();
        }
    }

    public EOQualifier primaryKeyQualifier() {
        NSDictionary<String, Object> pkDict = primaryKeyDictionary(false /* inTransaction */);
        EOEntity entity = entity();
        return entity.qualifierForPrimaryKey(pkDict);

    }
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: Code review for refreshToOneRelationshipWithKey
      • From: Theodore Petrosky <email@hidden>
  • Prev by Date: Re: Instance not found on dev machine
  • Next by Date: Re: Code review for refreshToOneRelationshipWithKey
  • Previous by thread: Re: Instance not found on dev machine
  • Next by thread: Re: Code review for refreshToOneRelationshipWithKey
  • Index(es):
    • Date
    • Thread