Esempio n. 1
0
        public void QueryForRecords(CLLocation location, Action <List <CKRecord> > completionHandler)
        {
            var radiusInKilometers = NSNumber.FromFloat(5f);
            var predicate          = NSPredicate.FromFormat("distanceToLocation:fromLocation:(location, %@) < %f",
                                                            new NSObject[] { location, radiusInKilometers });

            var query = new CKQuery(ItemRecordType, predicate)
            {
                SortDescriptors = new [] { new NSSortDescriptor("creationDate", false) }
            };

            var queryOperation = new CKQueryOperation(query)
            {
                DesiredKeys = new [] { NameField }
            };

            var results = new List <CKRecord> ();

            queryOperation.RecordFetched = (record) => results.Add(record);

            queryOperation.Completed = (cursor, error) => {
                if (error != null)
                {
                    Console.WriteLine("An error occured: {0}", error.Description);
                    return;
                }

                DispatchQueue.MainQueue.DispatchAsync(() => completionHandler(results));
            };

            publicDatabase.AddOperation(queryOperation);
        }
    private void Run()
    {
        Debug.Log("Example 3 - Querying");
        database = CKContainer.DefaultContainer().PrivateCloudDatabase;

        // We need a bunch of records to search through
        names = new string[] {
            "Alice",
            "Bob",
            "Charles",
            "Danni",
            "Exavier"
        };

        // Make an array of CKRecords and set the name field to each of the
        // names in the array above...
        //
        recordsToSearch = names.Select(name => {
            var record = new CKRecord("Person");
            record.SetString(name, "name");
            return(record);
        }).ToArray();

        // CloudKit uses a CKModifyRecrodsOperation for both saving and deleting
        // (which is sorta wierd). The first parameter is records to save, the
        // second is record id's to delete
        //
        Debug.Log("Creating records");
        CKModifyRecordsOperation op = new CKModifyRecordsOperation(
            recordsToSearch,
            null
            );

        // Important to set quality of service to UserInitiated or cloudkit
        // may run your query a LONG time from now. Like minutes from now
        // (seriously). The default value of NSQualityOfServiceUtility is insane
        // You can read more about QoS here:
        // https://developer.apple.com/library/archive/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html
        op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;

        // The modify records completion block is a callback function that's
        // invoked when the operation is complete
        op.ModifyRecordsCompletionBlock = OnRecordsSaved;

        database.AddOperation(op);

        var op2 = new CKFetchRecordsOperation(recordsToSearch.Select(x => x.RecordID).ToArray());

        op2.FetchRecordsCompletionHandler = (dictionary, error) =>
        {
            Debug.Log("Fetch records complete");
            //foreach (var kvp in dictionary)
            //{
            //    Debug.Log(string.Format("key:{0} value:{1}", kvp.Key.RecordName, kvp.Value));
            //}
        };
        database.AddOperation(op2);
    }
    void Run()
    {
        //var testDisposable = new TestDisposable();

        //Debug.Log("made dispasable: " + testDisposable);

        //StartCoroutine(WaitABit());
        var op = new CKModifyRecordsOperation(null, new CKRecordID[] {
            new CKRecordID("1CB545B1-7CA3-423E-A215-67DA56578270"),
            new CKRecordID("321A8AD3-0FA9-40C3-8D76-D76328A0A7F1")
        });

        database = CKContainer.DefaultContainer().PrivateCloudDatabase;

        Debug.Log("Setting callback");
        op.ModifyRecordsCompletionBlock = (records, recordIds, error) =>
        {
            Debug.Log("Modify records done");
        };

        //Debug.Log("Setting QoS");
        op.Configuration.QualityOfService = NSQualityOfService.Default;

        database.AddOperation(op);

        StartCoroutine(WaitABit());
    }
Esempio n. 4
0
        public void FetchRecords(string recordType, Action <List <CKRecord> > completionHandler)
        {
            var truePredicate = NSPredicate.FromValue(true);
            var query         = new CKQuery(recordType, truePredicate)
            {
                SortDescriptors = new [] { new NSSortDescriptor("creationDate", false) }
            };

            var queryOperation = new CKQueryOperation(query)
            {
                DesiredKeys = new [] { ValueField }
            };

            var results = new List <CKRecord> ();

            queryOperation.RecordFetched = (record) => {
                results.Add(record);
            };

            queryOperation.Completed = (cursor, error) => {
                if (error != null)
                {
                    Console.WriteLine("An error occured: {0}", error.Description);
                    return;
                }

                InvokeOnMainThread(() => completionHandler(results));
            };

            privateDatabase.AddOperation(queryOperation);
        }
Esempio n. 5
0
    private void OnRecordZoneCreated(CKRecordZone zone, NSError error)
    {
        Debug.Log(string.Format("Created record zone with name {0}", zone.ZoneID.ZoneName));

        // records you want to save to a custom zone are initialized with the zoneId
        var save1 = new CKRecord("SaveGame", customZone.ZoneID);

        // or if you need a custom record name, initialize with a recordID with the zoneId
        var save2 = new CKRecord("SaveGame", new CKRecordID("MySave", customZone.ZoneID));

        var op = new CKModifyRecordsOperation(new CKRecord[] { save1, save2 }, null);

        op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;
        op.ModifyRecordsCompletionBlock   = OnRecordsSaved;
        database.AddOperation(op);
    }
    private void OnQueryComplete(CKRecord[] records, NSError error)
    {
        Debug.Log("OnQueryComplete");

        if (error != null)
        {
            Debug.LogError(error.LocalizedDescription);
        }
        else
        {
            var result = records.FirstOrDefault();
            if (result != null)
            {
                Debug.Log(string.Format("found record: '{0}' with name: '{1}'",
                                        result.RecordID.RecordName, result.StringForKey("name")));
            }

            // Let's be tidy. Delete all the records we created
            // create an array of record id's from the records we saved
            var recordIds = recordsToSearch.Select(record => record.RecordID).ToArray();

            Debug.Log("Cleaning up, deleting the records we created....");
            var op = new CKModifyRecordsOperation(null, recordIds);

            op.ModifyRecordsCompletionBlock   = OnRecordsDeleted;
            op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;

            database.AddOperation(op);
        }
    }
Esempio n. 7
0
    private void OnQuery(CKRecord[] records, NSError error)
    {
        Debug.Log("query finished");

        if (error != null)
        {
            Debug.LogError(error.LocalizedDescription);
            return;
        }

        Debug.Log($"got {records.Length} records");
        DebugLogRecords(records);

        Debug.Log("cleaning up...deleting records");
        var deleteOp = new CKModifyRecordsOperation(null, records.Select(r => r.RecordID).ToArray());

        deleteOp.Configuration.QualityOfService = NSQualityOfService.UserInitiated;
        deleteOp.ModifyRecordsCompletionBlock   = (ckRecords, ids, arg3) =>
        {
            if (error != null)
            {
                Debug.LogError(error.LocalizedDescription);
            }
            else
            {
                Debug.Log("records deleted, you can exit the sample");
            }
        };
        database.AddOperation(deleteOp);
    }
    private void Run()
    {
        Debug.Log("Example 6 - Per Record Progress");

        database = CKContainer.DefaultContainer().PrivateCloudDatabase;

        // Let's create 5 files at 1MB a piece
        // So we have enough data to see some upload progress

        // BTW CloudKit recommends that if your data exceeds 1MB you should put
        // it inside a CKAsset

        for (int i = 0; i < numFiles; i++)
        {
            var    record = new CKRecord("BigFile");
            byte[] bytes  = new byte[1000000];
            record.SetBuffer(bytes, "bytes");

            records[i] = record;
        }

        var op = new CKModifyRecordsOperation(records, null);

        op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;

        op.PerRecordProgressBlock       = OnPerRecordProgress;
        op.PerRecordCompletionBlock     = OnPerRecordComplete;
        op.ModifyRecordsCompletionBlock = OnRecordsSaved;

        database.AddOperation(op);
    }
    private void DeleteRecords()
    {
        Debug.Log("Cleaning Up");
        var op = new CKModifyRecordsOperation(null, records.Select(r => r.RecordID).ToArray());

        op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;
        op.ModifyRecordsCompletionBlock   = OnRecordsDeleted;
        database.AddOperation(op);
    }
Esempio n. 10
0
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Example - NSSortDescriptor");

        Debug.Log("container is: " + CKContainer.DefaultContainer().ContainerIdentifier);

        database = CKContainer.DefaultContainer().PrivateCloudDatabase;

        var n = 10;

        Debug.Log($"making {n} records");
        var records = new CKRecord[n];

        for (var i = 0; i < records.Length; i++)
        {
            records[i] = new CKRecord(recordType);
        }

        // Make some records share the same field value
        // so we can test primary/secondary sorting
        for (var i = 1; i < n; i += 2)
        {
            var field = RandomString(8);
            records[i - 1].SetString(field, primaryFieldKey);
            records[i].SetString(field, primaryFieldKey);
        }

        for (var i = 0; i < n; i++)
        {
            var field = RandomString(4);
            Debug.Log(field);
            records[i].SetString(field, secondaryFieldKey);
        }

        Debug.Log("Saving records");
        var op = new CKModifyRecordsOperation(records, null);

        op.Configuration.QualityOfService = NSQualityOfService.UserInitiated;
        op.ModifyRecordsCompletionBlock   = OnRecordsSaved;
        database.AddOperation(op);
    }