Update Nested object Value on Realm iOS - ios

Below is the data that I have fetched from server and save to realm DB, When I try to updating scheduler_data values and stop values, but they doesn't update
(
{
"form_id" = 3703;
id = 180;
"parent_id" = 0;
"scheduler_data" = {
repeat = 7;
"schedule_for" = task;
"start_date" = "2018-08-17T11:55:41.867Z";
"start_time" = "2018-08-17T11:59:44.289Z";
stop = {
field = COL1;
operation = "equal_to";
value = "time";
};
state = 58;
territory = GHTY67;
}
)
Here the code for to update Value
SaveTaskDatabase is the table name
for saveData in realm.objects(SaveTaskDatabase.self).filter("unq_id == %#",taskUni_ID){
try! realm.write {
saveData.scheduler_data?.stop?.operation = "add"
saveData.scheduler_data?.stop?.field = "muliple"
saveData.scheduler_data?.stop?.value = "baseOnValue"
}
}

Related

JSON: Extracting Data Using Alamofire and Swift 3

Can anyone tell me how to get the data out of this JSON?
Here is my code followed by the JSON
let URL = "URL"
Alamofire.request(URL).responseJSON
{ response in
print("HereBegins: = \(response)")
let result = response.result.value as? [String:Any]
}
the json being returned is...
HereBegins: = SUCCESS:
{
items =
(
{
addToCartUrl = "blah blah URL";
affiliateAddToCartUrl = "blah blah another URL";
availableOnline = 0;
brandName = Generic;
bundle = 0;
categoryNode = "976759_1071964_976788";
categoryPath = "Food/Fresh Food/Dairy, Eggs & Cheese/Milk & Cream";
clearance = 0;
customerRating = "5.0";
customerRatingImage = "http://i2.walmartimages.com/i/CustRating/5.gif";
freeShipToStore = 0;
freeShippingOver50Dollars = 1;
giftOptions = {
allowGiftMessage = 0;
allowGiftReceipt = 0;
allowGiftWrap = 0;
};
imageEntities =
(
{
entityType = SECONDARY;
largeImage = "https://i5.walmartimages.com/asr/c2bc3886-fb4f-4c46-b7e9-0cc4ebabc7c1_1.d42acf75b29b132532d5953b139b115f.jpeg?odnHeight=450&odnWidth=450&odnBg=FFFFFF";
mediumImage = "https://i5.walmartimages.com/asr/c2bc3886-fb4f-4c46-b7e9-0cc4ebabc7c1_1.d42acf75b29b132532d5953b139b115f.jpeg?odnHeight=180&odnWidth=180&odnBg=FFFFFF";
thumbnailImage = "https://i5.walmartimages.com/asr/c2bc3886-fb4f-4c46-b7e9-0cc4ebabc7c1_1.d42acf75b29b132532d5953b139b115f.jpeg?odnHeight=100&odnWidth=100&odnBg=FFFFFF";
},
{
entityType = PRIMARY;
largeImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=450&odnWidth=450&odnBg=FFFFFF";
mediumImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=180&odnWidth=180&odnBg=FFFFFF";
thumbnailImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=100&odnWidth=100&odnBg=FFFFFF";
}
);
isTwoDayShippingEligible = 0;
itemId = 46491746;
largeImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=450&odnWidth=450&odnBg=FFFFFF";
longDescription = "<br><b>Great Value Vanilla Almond Milk, 64 fl oz:</b><br><ul><li>Delicious flavor</li><li>Great Value almond milk comes in a 64 fl oz carton</li><li>Vitamins A, D and E added</li><li>Added calcium</li><li>Only 80 calories per serving</li></ul>";
marketplace = 0;
mediumImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=180&odnWidth=180&odnBg=FFFFFF";
modelNumber = 11951;
name = "Great Value Vanilla Almond Milk, 64 fl oz";
ninetySevenCentShipping = 0;
numReviews = 3;
offerType = "STORE_ONLY";
parentItemId = 46491746;
preOrder = 0;
productTrackingUrl = "http://linksynergy.walmart.com/fs-bin/click?id=|LSNID|&offerid=223073.7200&type=14&catid=8&subid=0&hid=7200&tmpid=1082&RD_PARM1=https%253A%252F%252Fwww.walmart.com%252Fip%252FGreat-Value-Vanilla-Almond-Milk-64-fl-oz%252F46491746%253Faffp1%253DHzNQqMKL6fuAwFZnu_RUqysY3U3RzuxH0bQKAHNYr0Q%2526affilsrc%253Dapi";
productUrl = "http://c.affil.walmart.com/t/api03?l=https%3A%2F%2Fwww.walmart.com%2Fip%2FGreat-Value-Vanilla-Almond-Milk-64-fl-oz%2F46491746%3Faffp1%3DHzNQqMKL6fuAwFZnu_RUqysY3U3RzuxH0bQKAHNYr0Q%26affilsrc%3Dapi%26veh%3Daff%26wmlspartner%3Dreadonlyapi";
salePrice = "2.58";
shipToStore = 0;
standardShipRate = 0;
stock = "Not available";
thumbnailImage = "https://i5.walmartimages.com/asr/1d575fe6-b8c9-4dc6-821b-42cbde621373_1.4764431b7ebfb4707c0a2f7fe47e85cc.jpeg?odnHeight=100&odnWidth=100&odnBg=FFFFFF";
upc = 078742052366;
}
);
}
Figured it out.
if let resData = result["items"].arrayObject {
arrRes = resData as! [[String:AnyObject]]
for element in arrRes[0]
{
print(element)
}
print(arrRes[0]["name"])

How Parse JSON from API [duplicate]

This question already has answers here:
type 'Any' has no subscript members
(2 answers)
Closed 5 years ago.
i know to much ask like this. i already searching but not match with my problems.
oke i will try explain with my code
i have data API Like this
["profile": {
accountId = 58e470a0c50472851060d083;
androidDeviceId = "[\"3453247ddcf3f809\"]";
androidVersion = 21;
appId = (
"c46b4c10-62ce-11e6-bdd4-59e4df4b8410",
"fac915f0-fe2b-11e6-9dfb-55339bd7be35"
);
appVersion = "v5.1.0";
avatar = "https://account.8villages.com/uploads/images/5/1491366164_bnx1t0rudi.jpg";
birthDate = "12/03/1994";
"channel-group" = android;
communityId = 553e09b251906884443eff85;
coordinates = {
coordinates = (
"106.9602383333333",
"-6.249333333333334"
);
type = Point;
};
crop = "";
crops = "<null>";
customerId = 5369bd85cae84d0e03246a7c;
dateSubmitted = {
iso = "2017-04-05T04:20:48.483Z";
timestamp = 1491366048;
};
fullName = "Megi Fernanda";
gender = "Laki-laki";
homeAddress = Payakumbuah;
location = "Kota Payakumbuh";
moderation = {
at = {
iso = "2017-04-05T04:20:48.483Z";
timestamp = 1491366048;
};
by = auto;
status = moderated;
};
skill = "Budidaya pertanian";
state = "Sumatera Barat";
storeType = "";
subdistrict = "Payakumbuh Barat";
totalConversations = {
articles = 0;
forums = 0;
questions = 2;
responses = 0;
storeItems = 1;
};
type = users;
university = "Politeknik Negeri Pertanian Payakumbuh";
}, "accessToken": {
key = "lH5aYvnp2JAZ6zoKQK4mpfsxCI0.";
secret = "yfZfTZbsaVIhKCbksGHQnPcPg9mKtoRAKyvjg_cgMeo.";
}]
i already can got fullName, Addres, Skill State etc
if let profile = json["profile"] as? NSDictionary {
let name = profile["fullName"]
let alamat = profile["Skill"]
}
but i don't know how to get atribut in totalConversation like question, storeItems, points
skill = "Budidaya pertanian";
state = "Sumatera Barat";
storeType = "";
subdistrict = "Payakumbuh Barat";
totalConversations = {
articles = 0;
forums = 0;
questions = 2;
responses = 0;
storeItems = 1;
};
i tried like
let profile = json["profile"]["totalConversation"] as? NSDictionary
error sign : Type 'any?' has no subscript members
You got that error because json["profile"] is Any type and it doesn't have any subscript. So you need to cast json["profile"] to a dictionary, [String: Any] is dictionary type in Swift.
if let profile = json["profile"] as? [String: Any] {
if let totalConversations = profile["totalConversations"] as? [String: Any] {
let questions = totalConversations["questions"] as? Int
}
}

How to index into Array of Dictionaries

I have an object that looks like this in the console. It seems like an array with a dictionary inside. How can I get to the address field?
Optional((
{
address = "xxxxxxx#gmail.com";
verified = 1;
}
))
The object comes from this object:
<METDocument key: <collection: users, ID: KTsCySacEAiz3eDnf>, fields: {
emails = (
{
address = "xxxxxxx#gmail.com";
verified = 1;
}
);
profile = {
address = {
city = Oslo;
country = nor;
lineOne = "address";
lineTwo = "";
zip = 0264;
};
birthdate = "1985-09-01 23:00:00 +0000";
card = {
last4 = 4242;
verified = 1;
};
filledOut = 1;
gender = Male;
name = {
first = "Elon";
last = "Musk";
};
phone = 911;
validated = 1;
};
}>
I access the emails key by this method:
let emails = users.allDocuments[0].valueForKey("emails")
The content of the object is an optional array.
There are two options:
Safe access:
if let emails = users.allDocuments[0].objectForKey("emails") where emails.count > 0 {
if let address = emails[0]["address"] as? String {
print(address)
}
}
If it's guaranteed that the dictionary in the array and the key address exists:
let emails = users.allDocuments[0].objectForKey("emails")!
let address = emails[0]["address"] as! String

NSDictionary annidate in swift

I have this json result.
I would take the field "alert".
I try this:
var alert: NSString = jsonResult["features"]["properties"]["alert"]
but this is the error: does not have a member named 'subscript'.
I can not how to access a field in a nested dictionary
{
features = (
{
geometry = {
coordinates = (
"-97.95359999999999",
"37.2382",
5
);
type = Point;
};
id = usb000si7g;
properties = {
alert = green;
cdi = "5.8";
code = b000si7g;
detail = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/usb000si7g.geojson";
dmin = "0.017";
felt = 1258;
gap = 38;
ids = ",usb000si7g,";
mag = "4.3";
magType = mwr;
mmi = "4.94";
net = us;
nst = "<null>";
place = "8km SE of Harper, Kansas";
rms = "0.51";
sig = 864;
sources = ",us,";
status = reviewed;
time = 1412272884590;
title = "M 4.3 - 8km SE of Harper, Kansas";
tsunami = "<null>";
type = earthquake;
types = ",cap,dyfi,general-link,geoserve,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,";
tz = "-300";
updated = 1412614943519;
url = "http://earthquake.usgs.gov/earthquakes/eventpage/usb000si7g";
};
type = Feature;
}
);
metadata = {
api = "1.0.13";
count = 1;
generated = 1412617232000;
status = 200;
title = "USGS Significant Earthquakes, Past Week";
url = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_week.geojson";
};
type = FeatureCollection;
}
I don't know what to do. swift is changed every beta.
As #Kirsteins said is his answer, you have to do a lot of unwrapping, and it's recommended to use a JSON library.
If you still want to stick with hand made extraction, then I suggest you to made it programmatically, such as adding an extension to NSDictionary as follows:
extension NSDictionary {
func objectForTreeKeys<T>(keys:[String]) -> T? {
var dict: NSDictionary? = self
var retValue: T?
for key in keys {
var value: AnyObject? = dict?.objectForKey(key)
if let unwrapped = value as? NSDictionary {
dict = unwrapped
} else if let unwrapped = value as? T {
retValue = unwrapped
break
} else {
retValue = nil
break
}
}
return retValue
}
}
You pass an array of keys to the function, and it traverses all nested dictionaries until:
a value of type T is encountered
a value having type different than NSDictionary and T is found
a nil value is found
In the first case, it returns the value of T type - in the other cases it returns nil.
You can use it as follows:
let ret: String? = jsonResult.objectForTreeKeys(["features", "properties", "alert"])
As you can see, it's a generic method, and the return type is inferred from the type of the variable the result is assigned to - so it's necessary to explicitly define its type, which must be optional (String? in this specific case).

An object that has a key that matches the key of the supplied object could not be found in the ObjectStateManager

I Use following code
Tel_CallHistory CallHistory = new Tel_CallHistory();
CallHistory.MobileNo = MobileNo;
CallHistory.CRId = CallResponse;
CallHistory.CallRemark = CallRemark;
CallHistory.UserId = UserId;
CallHistory.CallDate = DateTime.Now;
CallHistory.CallTime = DateTime.Now.TimeOfDay;
CallHistory.MeetingPoint = meetingpoint;
if (CallResponse == 1)
{
CallHistory.NCallDateOn = null;
CallHistory.NCallTimeAt = null;
CallHistory.MeetingDate = Convert.ToDateTime( meetingdate);
CallHistory.MeetingTime = DateTime.Parse(meetingtime).TimeOfDay;
}
else
{
CallHistory.NCallDateOn = Convert.ToDateTime(NCallDateOn);
CallHistory.NCallTimeAt = DateTime.Parse(NCallTimeAt).TimeOfDay;
CallHistory.MeetingDate = null;
CallHistory.MeetingTime = null;
}
db.Tel_CallHistory.AddObject(CallHistory);
Tel_Mobile TelMobile = _teacher.getDB().Tel_Mobile.Single(a => a.MobileNo == MobileNo);
TelMobile.CallDate = CallHistory.NCallDateOn;
TelMobile.CallTime = CallHistory.NCallTimeAt;
TelMobile.LCallDateOn = CallHistory.CallDate;
TelMobile.LCallTimeAt = CallHistory.CallTime;
TelMobile.LCRId = CallHistory.CRId;
TelMobile.LCallRemark = CallHistory.CallRemark;
TelMobile.LMeetingPoint = CallHistory.MeetingPoint;
TelMobile.LMeetingDate = CallHistory.MeetingDate;
TelMobile.LMeetingTime = CallHistory.MeetingTime;
db.Tel_Mobile.ApplyOriginalValues(TelMobile);
db.SaveChanges();
db.AcceptAllChanges();
but when db.Tel_Mobile.ApplyOriginalValues(TelMobile) executes, show error
An object that has a key that matches the key of the supplied object
could not be found in the ObjectStateManager. Verify that the object
to which changes must be applied is not in the Added state and that
its key values match the key values of the supplied object.
You probably want to attach it.
db.Tel_Mobile.Attach(TelMobile);

Resources