#android #dart #flutter
#Android #dart #flutter
Вопрос:
Ответ сервера, возвращающий три массива JSON, и все объекты хранятся в базе данных один за другим и optionsGroupList
, attributes
assignedattributes
. В проекте у меня есть три таблицы с именами group
, attribute
и assignedattribute
. во-первых, я должен вставить все элементы optionsGroupList в таблицу групп, и я могу это сделать, во втором массиве, который я получаю groupid
, attributeid
, attributename
но во второй таблице у меня есть 4 столбца, в которых есть groupid
, attributeid
attributename
, groupname
,,, но для groupname я должен получить запись определенной группы по идентификатору группы из таблицы групп, но мой второй цикл выполняется первым, поэтому я не могу получить запись группы из-за того, что цикл все еще вставляет записи, когда начался мой второй цикл прежде чем завершить первую, моя вторая таблица зависит от первой, а моя третья таблица зависит от второй, поэтому мне нужно вставить запись после завершения одной. Иногда это работает правильно
{
"result": 1,
"data": "optionsList",
"merchantid": "MER-07156",
"optionsGroupList": [{
"grouprowid": "3012",
"groupname": "Color",
"isrequired": "0"
}],
"attributes": [{
"attributerowid": "20794",
"grouprowid": "3012",
"attributename": "Red",
"weight": "0"
}],
"assignedattributes": [{
"attributegrouprowid": "154577",
"productrowid": "342702",
"attributerowid": "20794",
"subsku": "",
"quantity": "0",
"pricechange": "4"
},
{
"attributegrouprowid": "154590",
"productrowid": "354723467",
"attributerowid": "20794",
"subsku": "0",
"quantity": "0",
"pricechange": "0"
}
]
}
Мой второй оператор отладки цикла печатается перед первым.
optionListService().then((onValue) async {
if (onValue.result == 1) {
//Loop 1
for(int i=0;i<onValue.optionsGroupList.length;i ){
_insertOption(onValue.optionsGroupList[i]);
}
//Loop 2
for(int j=0;j<onValue.attributes.length;j ){
debugPrint('Attribute Name:--${ onValue.attributes[j].attributename}');// this is printed first before first loop excuted
List groupIdList=new List<Map<String,dynamic>>();
groupIdList= await dbHelper.queryReadOption(onValue.attributes[j].grouprowid); // here i'm finding group name from group table but i think is executing first.
if(groupIdList.length>0){
_insertOptionAttribute(onValue.attributes[j],groupIdList[0][DatabaseHelper.columnGroupName],groupIdList[0][DatabaseHelper.columnIsRequired]);
}
}
//Loop 3
for(int i=0;i<onValue.assignedattributes.length;i ){
String attr=onValue.assignedattributes[i].attributerowid;
arrtIdList=new List<Map<String,dynamic>>();
arrtIdList= await dbHelper.queryReadAttribute(attr);
if(arrtIdList.length>0){
_insertProductWithAttribute(
onValue.assignedattributes[i],
arrtIdList[0][DatabaseHelper.columnGroupId],
arrtIdList[0][DatabaseHelper.columnGroupName],
arrtIdList[0][DatabaseHelper.columnAttributeName],
arrtIdList[0][DatabaseHelper.columnIsRequired],
arrtIdList[0][DatabaseHelper.columnWeight]
);
}
}}});}
Ответ №1:
просто добавьте второй цикл в цепочку блоков «then» и в первом блоке верните переменную «onValue». вот так:
optionListService().then((onValue) async {
if (onValue.result == 1) {
//Loop 1
for(int i=0;i<onValue.optionsGroupList.length;i ){
_insertOption(onValue.optionsGroupList[i]);
}
}
return onValue;
}).then((onValue) {
if (onValue.result == 1) {
//Loop 2
for(int j=0;j<onValue.attributes.length;j ){
// some code
}
}
});