AMcoder - javascript, python, java, html, php, sql

Ինչպես թարմացնել ցուցակի տվյալները՝ ըստ Կոտլինի սենյակի կողմից օգտագործվող կազմակերպության մեկ այլ դաշտի

Ես ունեմ ցուցակ (սենյակի տվյալները) ինչ-որ տարրով և ցանկանում եմ թարմացնել տվյալ տարրի տվյալները: Օրինակ, ես ունեմ այսպիսի ցուցակ.

[
    {
        "id": 1,
        "mptId": 12,
        "value": 0  // the default value it's 0 / null but I showed in the app with 0 not null
    },
    {
        "id": 2,
        "mptId": 12,
        "value": null  // the default value it's 0 / null but I showed in the app with 0 not null
    },
    {
        "id": 3,
        "mptId": 12,
        "value": 0  // the default value it's 0 / null but I showed in the app with 0 not null
    }
]

Այնուհետև ես ուզում եմ թարմացնել value-ը ցուցակում, ըստ mptId-ի:

Ես արդեն ստեղծել եմ Դաոն այսպես.

@Query("UPDATE table_data SET value=:value WHERE mptId=:mptId")
fun testUpdate(value: Int?, mptId: Int?)

Եվ հետո, իմ ViewModel-ում այսպես.

val list = _currentSource.value as List<SourceDanaInvestasi>
viewModelScope.launch(IO) {
    try {
        for (i in list) {
            repository.updateTest(i.value, mptId.get()) // i.value that I want update, mptId that where clause
        }
    } catch (e: Throwable) {
        Timber.e("Error update investment fund : ${e.message}")
    }
}

Օրինակ, հավելվածում ես կթարմացնեմ value-ը ցուցակում այսպես.

[
    {
        "id": 1,
        "mptId": 12,
        "value": 10 // I edited from apps, the value from 0 to 10
    },
    {
        "id": 2,
        "mptId": 12,
        "value": 10 // I edited from apps, the value from 0 to 10
    },
    {
        "id": 3,
        "mptId": 12,
        "value": 20 // I edited from apps, the value from 0 to 20
    }
]

Բայց երբ ես ցուցադրում եմ ցուցակը խմբագրումից հետո, արդյունքն այսպիսին է.

[
    {
        "id": 1,
        "mptId": 12,
        "value": 20  // the value replaced by the last value
    },
    {
        "id": 2,
        "mptId": 12,
        "value": 20  // the value replaced by the last value
    },
    {
        "id": 3,
        "mptId": 12,
        "value": 20  // the value replaced by the last value
    }
]

value-ը միշտ փոխարինվում է հավելվածներից վերջին value-ով: Ինչպես տեսնում եք, ես հավելվածից խմբագրել եմ 10, 10, 20-ով, իսկ հետո վերջին արժեքը 20 է, ուստի ցուցակի բոլոր value-ը նույնպես փոխարինվել են 20-ով: Ինչու՞ դա տեղի ունեցավ:

Եվ, երբ ես խմբագրեցի ցուցակը հավելվածից այսպես.

[
    {
        "id": 1,
        "mptId": 12,
        "value": 0  // the value still 0 or I didn,t edited from the app
    },
    {
        "id": 2,
        "mptId": 12,
        "value": 0  // the value still 0 or I didn,t edited from the app
    },
    {
        "id": 3,
        "mptId": 12,
        "value": 20  // I only edited this value from 0 to 20 in the app
    }
]

Երբ ես այդպես խմբագրել եմ, բոլոր ապրանքների ցանկը չի թարմացվել, ես արդեն կարգաբերում եմ այն ​​և տվյալները, որոնք թարմացվել են, բայց չեն պահպանվել սենյակում, դա նշանակում է, որ ամբողջ ցուցակը պետք է խմբագրվի, որպեսզի այն կարողանա պահել սենյակում: Ինչու՞ դա նույնպես պատահեց:

Այսպիսով, իմ հարցն այն է, թե որն է լավագույն պրակտիկան թարմացնելու տվյալները ցուցակից՝ օգտագործելով սենյակի որոշակի դաշտ, ինչպիսին mptId է:

Fyi, id դա առաջնային բանալին է ավտոմատ ստեղծմամբ, mptId դա օտար բանալի է, և value դա այն է, ինչ ես ուզում եմ խմբագրել հավելվածից:


Պատասխանները:


1

Քանի որ mptId-ը նույնն է ամբողջ ցանկի կետերում: Այսպիսով, mptId=12 ունեցող բոլոր գրառումները թարմացվում են: Այսպիսով, դուք կարող եք տեսնել այն սխալը, որտեղ վերջին արժեքը արտացոլվում է ցուցակի բոլոր տարրերի մեջ: Դուք պետք է թարմացնեք տվյալների բազայի գրառումները՝ հիմնվելով «id»-ի, այլ ոչ «mptId»-ի վրա:

Խմբագրել:

Այն, ինչ ես հասկանում եմ ձեր նկարագրությունից հետևյալն է. Դուք ունեք ցուցակ տարբեր գրառումներով, որտեղ բոլոր mptId արժեքները 12 են: Եվ երբ փորձում եք թարմացնել տարբեր գրառումներ 10,10,20-ով: Խմբագրելուց հետո դուք ստանում եք թարմացված ցուցակը որպես 20,20,20: Ճիշտ եմ?

Եթե ​​այո, ապա դուք հարցումն է

@Query("UPDATE table_data SET value=:value WHERE mptId=:mptId")

Ի սկզբանե ցուցակը պարունակում է.

[
 {
    "id": 1,
    "mptId": 12,
    "value": 0  
},
{
    "id": 2,
    "mptId": 12,
    "value": null  
},
{
    "id": 3,
    "mptId": 12,
    "value": 0  
}
]

Եվ հետո դուք թարմացնում եք ցուցակը հետևյալ կերպ.

[
{
    "id": 1,
    "mptId": 12,
    "value": 10 // the value from 0 to 10
},

{
    "id": 2,
    "mptId": 12,
    "value": 10 //  the value from 0 to 10
},
{
    "id": 3,
    "mptId": 12,
    "value": 20 // the value from 0 to 20
}

]

Եվ հետո դուք անվանում եք սա.

    for (i in list) {
        repository.updateTest(i.value, mptId.get())        }

Օղակը գրում է 3 անգամ։

Կրկնություն 1. Այստեղ դուք փորձում եք թարմացնել բոլոր գրառումները mptId=12-ով 10 արժեքով

Արդյունք՝ սենյակը թարմացվել է՝

[
{
    "id": 1,
    "mptId": 12,
    "value": 10
},
{
    "id": 2,
    "mptId": 12,
    "value": 10 
},
{
    "id": 3,
    "mptId": 12,
    "value": 10 
}

Կրկնություն 2. Այստեղ դուք փորձում եք թարմացնել բոլոր գրառումները mptId=12-ով 10 արժեքով

Արդյունք՝ սենյակը թարմացվել է՝

[
{
    "id": 1,
    "mptId": 12,
    "value": 10 
},
{
    "id": 2,
    "mptId": 12,
    "value": 10 
},
{
    "id": 3,
    "mptId": 12,
    "value": 10 
}

Կրկնություն 3. Այստեղ դուք փորձում եք թարմացնել բոլոր գրառումները mptId=12-ով 20 արժեքով

Արդյունք՝ սենյակը թարմացվել է՝

[
{
    "id": 1,
    "mptId": 12,
    "value": 20 
},
{
    "id": 2,
    "mptId": 12,
    "value": 20 
},
{
    "id": 3,
    "mptId": 12,
    "value": 20 
}

Սա վերջնական արդյունքն է, որը դուք տեսնում եք:

Լուծում:

Կարող եք թարմացնել ձեր հարցումը հետևյալ կերպ.

  @Query("UPDATE table_data SET value=:value WHERE mptId=:mptId and id = :id
  ")

Օղակի համար որպես.

for (i in list) {
        repository.updateTest(i.value, mptId.get(),id.get())        }

Սա կաշխատի, եթե ցուցակի id-ն և տվյալների բազայի աղյուսակում id-ն նույնն են:

17.05.2020
  • Այո, ինչու եմ ես օգտագործում mptId, ապա id, դա պայմանավորված է այս աղյուսակի առնչությամբ մեկ այլ աղյուսակի հետ: Այսպիսով, երբ ես խմբագրում եմ մեկ այլ աղյուսակ PK-ի հիման վրա, բայց այս աղյուսակում ես խմբագրում եմ FK-ի հիման վրա (mptId): PK այլ սեղանների վրա FK է այս աղյուսակում: 18.05.2020
  • Եվ այո, ես պետք է թարմացնեմ բոլոր գրառումները mptId=12-ով (նույն mptId-ով): Բայց խնդիրն այն է, որ value-ը միշտ նույն գրառումն է, չի տատանվում՝ կախված հավելվածի մուտքագրումից: Նկատի ունեմ, որ հավելվածում ես խմբագրել եմ բոլոր valuemptId=12-ով 0-ից 10,10,20, իսկ հետո value20,20,20 է: Դա պետք է լինի 10, 10, 20, ճիշտ է: 18.05.2020
  • Եվ նաև, երբ ես խմբագրեցի value-ը հավելվածից այսպես, 10,0,20 (0 դա նշանակում է, որ ես չեմ խմբագրում այն): value-ը խմբագրված չէ, դա նշանակում է, որ բոլոր valueները միշտ պետք է խմբագրվեն: Այսպիսով, սա նույնպես իմ խնդիրն է: Եվ այո, դուք կարող եք նորից կարդալ իմ հարցը իմ խնդրի մասին: 18.05.2020
  • Կներեք ուշացման համար, FYI, SourceDanaInvestasi մոդելում այն ​​API-ից է և չուներ id (հիմնական բանալի), քանի որ այն API-ից է: Եվ իմ ցուցակի օրինակը, այն մեկ այլ մոդելից է (սուբյեկտ) id-ով PK է և ավտոմատացված է: Այսպիսով, հոսքը այսպիսին է. Նախ, ես բացում եմ էջը և ստանում տվյալներ API-ից, այնուհետև վերադառնում եմ նախորդ էջ՝ պահպանելով բոլոր տվյալները API-ից (SourceDanaInvestasi-ից մինչև նոր մոդել/սուբյեկտ) սենյակ: Այնուհետև ես նորից բացում եմ այդ էջը, բայց առայժմ ստանում եմ տվյալները սենյակից (սուբյեկտից) ոչ թե API-ից, որովհետև prev-ն արդեն պահպանում է այն։ 18.05.2020
  • Դրանից հետո ես խմբագրեցի list-ը, այնուհետև բացեցի նոր էջ՝ updated տվյալներով: Իսկ ինչպե՞ս ստանալ id-ը for հանգույցում API-ից (SourceDanaInvestasi), որպեսզի համապատասխանի id-ին կազմակերպության կողմից որպես PK: Եթե ​​տեսնում եք ձեր պատասխանը, մենք պետք է սահմանենք id.get(), բայց ինչպե՞ս դինամիկ կերպով ստանալ id-ը կազմակերպությունից: Այսպիսով, query update-ը կարող է իմանալ id-ը, որը ես համընկել եմ սենյակի տվյալները թարմացնելու ֆունկցիայի վրա: 18.05.2020
  • API-ն ձեզ տալիս է միայն խմբագրված գրառումները կամ mptId=12-ի բոլոր գրառումները: 18.05.2020
  • Եվ նաև ձեր մոդելը՝ SourceDanaInvestasi-ն, ունի՞ որևէ յուրահատուկ դաշտ: 18.05.2020
  • Այսպիսով, API-ն ինձ տալիս է list միայն մեկ կամ ավելի տարրով: Այդ ցանկում users, ովքեր օգտագործում են հավելվածը, կարող են edit բոլոր տարրերը (values) ցանկում կամ մասնակիորեն where clause-ով դա mptId է, քանի որ դա PK է մեկ այլ կազմակերպությունում (ծնող) և FK այս աղյուսակում: 18.05.2020
  • Այո, ունեն, API-ից տվեք lji_id որպես տող: It's unique and will not be the same as other items and only applies to the same mptId. 18.05.2020
  • Դրա համար ես օգտագործում եմ mptIdwhere clause-ի համար 18.05.2020
  • Քանի որ lji_id-ը ընդհանուր կլինի նույն արժեքով mptId-ի համար, այն հնարավոր չէ օգտագործել: Այո, ես հասկանում եմ, թե որն է այժմ կոդի նպատակը: Քանի որ առանձին գրառումների թարմացումը կարգավորելու ուղղակի միջոց չկա, այն, ինչ ես կարող եմ մտածել հետևյալն է. 1) օրինակ. Եթե դուք մտադիր եք թարմացնել գրառումները mptId=12-ով, գուցե ավելի լավ լինի բոլոր գրառումները հեռացնել տվյալների շտեմարանից mptId=12. Եվ նորից թարմացնելուց հետո տեղադրեք ցանկի բոլոր տարրերը mptId =12-ով: Այսպիսով, սա կարող է օգնել ձեզ: Քանի որ դուք կհեռացնեք FK գրառումները, դա չի վնասի PK-ին: 18.05.2020
  • Որպեսզի դա չառաջացնի գերծանրաբեռնվածություն, փորձեք չխփել տվյալների բազան օգտվողի կողմից մեկ տարրի խմբագրման դեպքում: Դուք կարող եք դա անել, երբ հետ սեղմեք կոճակը, մինչ այդ փոփոխությունները կարող են լինել ժամանակավոր հիշողության մեջ: 18.05.2020
  • Արդեն փորձեք ավելացնել lji_id և mptId որպես where clause, դա աշխատանք է: Շնորհակալություն 18.05.2020
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..