Theory
ચારેય operations, સાથે મળીને
તમે હવે Realtime Database માં લખી શકો છો અને એમાંથી વાંચી શકો છો. એમાં updating અને deleting ઉમેરો એટલે તમને પૂરું CRUD મળે છે: Create, Read, Update, Delete, એટલે કે કોઈ પણ app data સાથે જે કંઈ કરે તે બધું જ. FestConnect ચારેય વાપરે છે: registration ઉમેરવું, registrations ની યાદી બતાવવી, event સુધારવો, registration રદ કરવું.
આ પાઠ તમે અગાઉ જોયેલા ટુકડાઓમાંથી CRUD ને ભેગું કરે છે અને બે નવી બાબતો ઉમેરે છે: કોઈ ચોક્કસ item ને બદલવું અને એને કાઢી નાખવું. Update અને delete માટેની એક જ પૂર્વશરત એટલે item ની key જાણવી, એટલે શરૂઆત ત્યાંથી જ કરીએ.
Theory
તમને item ની key જોઈએ
કોઈ ચોક્કસ item ને update કે delete કરવા માટે તમારે એનો ચોક્કસ path નિશાન બનાવવો પડે, એટલે કે એની key જાણવી પડે. એ મેળવવાની બે રીત છે: item બનાવતી વખતે push() એ પાછી આપેલી key તમે સાચવી રાખી હોય, અથવા listening કરતી વખતે snapshot.key માંથી એ વાંચી લો (દરેક child snapshot પોતાની key જાણે છે).
Key હાથમાં હોય એટલે તમે એ item નું reference બનાવો છો, eventsRef.child(key), અને એના પર કામ કરો છો. એટલા માટે જ વાંચતી વખતે ઘણી વાર દરેક item ને એની key સાથે જ સાચવવામાં આવે છે: જેથી UI પછીથી એ ચોક્કસ entry માટે edit અને delete આપી શકે. Key નહીં, તો નિશાનવાળું update કે delete પણ નહીં.
Practical
કોઈ ચોક્કસ item ને update અને delete કરવું
val eventsRef = FirebaseDatabase.getInstance().getReference("events")
// UPDATE specific fields without overwriting the whole node:
eventsRef.child(key).updateChildren(mapOf("seats" to 40))
// (or replace the whole item with setValue)
// eventsRef.child(key).setValue(updatedEvent)
// DELETE the item entirely:
eventsRef.child(key).removeValue()
// CREATE was: eventsRef.push().setValue(event)
// READ was: eventsRef.addValueEventListener(...)Formula
updateChildren fields બદલે છે; setValue આખો node બદલી નાખે છે
Update માટે એક મહત્ત્વનો ભેદ છે. updateChildren(map) ફક્ત તમે યાદીમાં આપેલાં fields જ બદલે છે અને item નો બાકીનો ભાગ એમનો એમ રહેવા દે છે, એટલે updateChildren(mapOf("seats" to 40)) ફક્ત seats બદલે છે અને name તથા date સાચવી રાખે છે. Item ના node પર setValue કરવાથી આખું item બદલાઈ જાય છે, એટલે જો તમે ફક્ત seats માટે setValue કરો, તો બાકીનાં fields ભૂંસાઈ જાય.
એટલે થોડાં fields સુધારવાં હોય ત્યારે updateChildren પસંદ કરો; setValue ત્યારે જ વાપરો જ્યારે તમારે ખરેખર આખું item બદલી નાખવું હોય. આ બંનેની ભેળસેળ કરવી એ અજાણતાં data ભૂંસી નાખવાની જાણીતી રીત છે. Fields updateChildren થી બદલો; nodes setValue થી બદલો.
Quiz
તમારે event ના ફક્ત 'seats' field ને બદલવું છે, એના name કે date ને અસર થયા વગર. તમારે કઈ method વાપરવી જોઈએ?
- Event ના node પર setValue(mapOf("seats" to 40)), કારણ કે એ સૌથી સહેલું છે
- Event ના node પર updateChildren(mapOf("seats" to 40)), જે ફક્ત એ જ field બદલે છે અને બાકીનું એમનું એમ રહેવા દે છે
- removeValue(), કારણ કે એ કિંમત બદલી આપે છે
- push(), કારણ કે એ item ને સુધારે છે
Show the answer
Event ના node પર updateChildren(mapOf("seats" to 40)), જે ફક્ત એ જ field બદલે છે અને બાકીનું એમનું એમ રહેવા દે છે
updateChildren ફક્ત જણાવેલાં fields જ બદલે છે, એટલે updateChildren(mapOf('seats' to 40)) seats બદલે છે અને name તથા date ને અડતું નથી, બરાબર એ જ ધ્યેય હતું. વિકલ્પ A એ જાળ છે: event ના node પર ફક્ત seats સાથે setValue કરવાથી આખું item બદલાઈ જાય અને name તથા date ભૂંસાઈ જાય (setValue આખા node ને overwrite કરે છે). વિકલ્પ C, એટલે કે removeValue, item ને કાઢી નાખે છે, જે તમારે નથી જોઈતું. વિકલ્પ D, એટલે કે push, નવી key સાથે નવું item બનાવે છે, હાલના item ને સુધારતું નથી. આંશિક સુધારા માટે updateChildren વાપરો; setValue ને આખો node બદલવા માટે જ રાખો.
Think first
updateChildren અને setValue વચ્ચેનો ભેદ આટલો બધો કેમ મહત્ત્વનો છે?
બંને data લખે છે. તો પણ એ બંનેની ભેળસેળ ગંભીર અને data નો નાશ કરનારી ભૂલ કેમ ગણાય? વિચારીને પછી tap કરો.
Show the answer
કારણ કે node પર setValue કરવાથી એ node પરનું બધું જ બદલાઈ જાય છે, એટલે તમારો ઇરાદો ફક્ત આંશિક સુધારાનો હોય ત્યારે એ વાપરવાથી તમે જે fields લખ્યાં નથી એ ચૂપચાપ ભૂંસાઈ જાય છે, એટલે કે શાંત પણ વિનાશક data-loss bug સર્જાય છે.
ધારો કે એક event આ રીતે સાચવેલો છે: { name: 'Robotics', date: '2026-08-01', seats: 50 }. તમારે seats ઘટાડીને 40 કરવા છે. જો તમે event ના node પર updateChildren(mapOf('seats' to 40)) બોલાવો, તો Firebase એ ફેરફારને ભેળવી દે છે: seats 40 થાય છે, અને name તથા date જેમનાં તેમ રહે છે, એટલે કે બરાબર.
પણ જો તમે એ જ node પર setValue(mapOf('seats' to 40)) બોલાવો, તો Firebase એનો અર્થ એવો કરે છે કે 'આખો event હવે ફક્ત { seats: 40 } જ છે', એટલે એ આખા node ને overwrite કરી નાખે છે, અને name તથા date જતાં રહે છે. કોઈ error આવતી નથી; write સફળ થાય છે; તમે ફક્ત data નો નાશ કરી નાખ્યો હોય છે. આ એટલા માટે જ ખતરનાક છે કે એ ચાલવું જ જોઈએ એવું લાગે છે અને ચૂપચાપ નિષ્ફળ જાય છે, એટલે કે એવો bug જે production માં records બગાડે છે અને શોધવો અઘરો પડે છે.
મનમાં રાખવા જેવો નકશો આ છે: setValue એટલે 'આ node હવે બરાબર આટલો જ છે', પૂરેપૂરી અદલાબદલી, જ્યારે updateChildren એટલે 'આ ચોક્કસ ફેરફારો ભેળવી દે', એટલે કે આંશિક સુધારો. તેથી હાલના item નાં થોડાં fields સુધારવાં હોય ત્યારે updateChildren પકડો; setValue ત્યારે જ વાપરો જ્યારે તમારો ખરેખર આખું item બદલી નાખવાનો ઇરાદો હોય (અથવા એને નવેસરથી બનાવતા હો). આ ભેદ જાણવો તમારા data ને બચાવે છે, અને એટલે જ એને ઘૂંટવા જેવો છે. બદલવું કે ભેળવવું: તમારો ખરો ઇરાદો હોય એ પસંદ કરો.
Summary
Key takeaways
- Realtime Database પર પૂરું CRUD: push().setValue થી Create, listener થી Read, ચોક્કસ path પર Update, અને removeValue થી Delete.
- કોઈ ચોક્કસ item ને update કે delete કરવા માટે એની key જોઈએ, જે push() માંથી સાચવેલી હોય કે snapshot.key માંથી વાંચેલી હોય.
- ref.child(key) વડે item નું reference બનાવો, પછી એના પર કામ કરો.
- updateChildren(map) ફક્ત જણાવેલાં fields બદલે છે અને બાકીનું એમનું એમ રહેવા દે છે.
- Item ના node પર setValue આખું item બદલી નાખે છે, એટલે તમે છોડી દીધેલાં fields ભૂંસાઈ શકે છે.
- removeValue() item ને પૂરેપૂરું કાઢી નાખે છે.
- યાદ રાખવાની કડી: push એટલે create, listen એટલે read, આંશિક સુધારા માટે updateChildren (setValue તો બદલી નાખે), removeValue એટલે delete.