הגירת סכמת Realm: הימנעות מאובדן נתונים בעדכון
Realm זורק Migration is required due to the following errors כאשר הסכמה אינה תואמת. אם אפליקציה עם 10,000 משתמשים לא מגדירה הגירה תקינה, העדכון יגרום לקריסה אצל כל משתמש עשירי — וביקורות שליליות ב-App Store מובטחות. בניגוד ל-Room או Core Data, Realm דורש ציון מפורש של גרסת הסכמה הנוכחית בתצורה — ואם שוכחים את זה, האפליקציה תקרוס בגישה הראשונה למסד הנתונים. הניסיון שלנו מראה שהגירה מוגדרת כהלכה מההתחלה מבטלת זמני השבתה ומפחיתה את זמן הבדיקות ב-30%.
כיצד Realm קובע אם יש צורך בהגירה?
גרסת הסכמה מאוחסנת בתוך קובץ .realm. Realm משווה את הגרסה בקובץ לגרסה שצוינה ב-RealmConfiguration.schemaVersion. אם הגרסאות אינן תואמות ו-migrationBlock לא מוגדר — נוצרת חריגה. מפתחים שוכחים לעתים קרובות להגדיל את schemaVersion — זה מוביל לקריסה אצל 90% מהמשתמשים בעדכון. העלות של באג כזה היא אובדן מוניטין וזמן לשחרור חירום.
// iOS — базовая конфигурация с миграцией
let config = Realm.Configuration(
schemaVersion: 3,
migrationBlock: { migration, oldSchemaVersion in
if oldSchemaVersion < 2 {
// Миграция 1 → 2: добавлен атрибут category
migration.enumerateObjects(ofType: Transaction.className()) { old, new in
new?["category"] = ""
}
}
if oldSchemaVersion < 3 {
// Миграция 2 → 3: переименование поля
migration.renameProperty(onType: Transaction.className(), from: "note", to: "description")
}
}
)
Realm.Configuration.defaultConfiguration = config
לפי התיעוד הרשמי של Realm, כל ההגירות מכל גרסה ישנה יותר לנוכחית מבוצעות ב-// iOS — базовая конфигурация с миграцией let config = Realm.Configuration( schemaVersion: 3, migrationBlock: { migration, oldSchemaVersion in if oldSchemaVersion < 2 { // Миграция 1 → 2: добавлен атрибут category migration.enumerateObjects(ofType: Transaction.className()) { old, new in new?["category"] = "" } } if oldSchemaVersion < 3 { // Миграция 2 → 3: переименование поля migration.renameProperty(onType: Transaction.className(), from: "note", to: "description") } } ) Realm.Configuration.defaultConfiguration = config יחיד — Realm עצמו קובע מאיזו גרסה להתחיל. אם יש לך 5 גרסאות וקובץ המשתמש נמצא בגרסה 1, Realm יחיל את כל השלבים הביניים ברצף.
מדוע חשוב להגדיר את schemaVersion כראוי?
בכל פעם שאתה משנה את מודל הנתונים (הוספה, הסרה, שינוי שם של שדות), עליך להגדיל את migrationBlock בלפחות 1. אם לא, Realm יזרוק חריגה בעת ניסיון לפתוח את מסד הנתונים במכשיר המשתמש. דמיין: אתה משחרר עדכון עם גרסת מודל חדשה אבל שוכח לעדכן את גרסת הסכמה — כל המשתמשים (יכולים להיות מיליון) לא יוכלו להפעיל את האפליקציה. העלות של באג כזה נמדדת לא רק בזמן תיקון אלא גם באובדן מוניטין. אנו מבטיחים שזה לא יקרה בפרויקט שלך. החיסכון בתמיכה לאחר הגירה תקינה מחזיר את עצמו תוך 2–4 שבועות.
אילו סוגי פעולות נתמכים ב-migrationBlock?
הוספת שדה
Realm מוסיף אוטומטית שדות חדשים עם ערכי ברירת מחדל רק אם השדה הוא schemaVersion או שיש לו ברירת מחדל במודל. למילוי בערכים לא סטנדרטיים — optional. באנדרואיד (Realm Kotlin SDK), ההגירה מוגדרת דרך enumerateObjects:
// Android (Realm Kotlin SDK) migration.iterate("Transaction") { oldObject, newObject ->
val oldCategory = oldObject.getNullableValue<String>("category")
newObject.set("category", oldCategory ?: "uncategorized")
} הסרת שדה
Realm פשוט מתעלם משדות שאינם קיימים במודל החדש. אין צורך בהגירה מפורשת — אבל עדיין צריך להגדיל את AutomaticSchemaMigration. זה לעתים קרובות גורם לבלבול: מפתחים חושבים שההסרה בטוחה, אבל אם הגרסה לא מעודכנת, Realm זורק חריגה.
שינוי שם של שדה
migration.renameProperty(onType: "User", from: "fullName", to: "displayName") זה שומר על הנתונים. אם תמחק את השדה הישן ותוסיף שדה חדש, הנתונים יאבדו. אנו ממליצים תמיד להשתמש ב-// Android (Realm Kotlin SDK) migration.iterate("Transaction") { oldObject, newObject -> val oldCategory = oldObject.getNullableValue<String>("category") newObject.set("category", oldCategory ?: "uncategorized") } כדי לשמור על תאימות לאחור.
שינוי סוג שדה
המרת סוג ישירה אינה נתמכת — זו מגבלה של Realm. גישה: קרא את הערך הישן, כתוב לשדה חדש מהסוג החדש, ולאחר מכן הסר את השדה הישן מהמודל (Realm ימחק אותו אוטומטית). לדוגמה, אם schemaVersion היה מחרוזת והופך למספר נקודה צפה:
migration.enumerateObjects(ofType: "Product") { old, new in
let priceString = old?["priceString"] as? String ?? "0"
new?["price"] = Double(priceString) ?? 0.0
} כיצד לנפות באגים בהגירה עם Realm Studio?
Realm Studio מאפשר לך לפתוח קובץ migration.renameProperty(onType: "User", from: "fullName", to: "displayName") ולהציג נתונים לפני ואחרי הגירה. שימושי לאימות נכונות. קובץ באנדרואיד: renameProperty (נגיש דרך Device Explorer ב-Android Studio). Realm Studio מעבד קבצים 50% מהר יותר מצפייה ישירה בדפדפן ותומך בסינון לפי מחלקות.
| כלי | יכולות | מהירות |
|---|---|---|
| Realm Studio | צפייה, סינון, ייצוא נתונים | גבוהה |
| דפדפן (JSON) | קריאה בלבד, ללא סינון | נמוכה |
כיצד אנו מבטיחים הגירה נכונה: תהליך ובדיקות
הגירת סכמה היא פעולה קריטית. שגיאה מובילה לאובדן נתונים, ושחזור מגיבוי לא תמיד אפשרי. למהנדסים שלנו יש ניסיון של 5+ שנים עם Realm והם מבטיחים ביצוע נכון של כל המעברים.
- ניתוח הסכמה הנוכחית והיסטוריית השינויים.
- כתיבת migrationBlock לכל הטרנספורמציות.
- בדיקות על Realm Studio ועל נתוני גיבוי אמיתיים.
- שילוב בפרויקט ופריסה דרך App Store/Google Play.
מה כלול בעבודה
אנו מספקים:
- תיעוד של שינויי הסכמה עם תיאור כל שלב.
- קוד הגירה עם בדיקות יחידה ובדיקות אינטגרציה.
- הוראות חזרה לגרסה הקודמת.
- תמיכה במהלך הפריסה למשך שבועיים.
עלות ההגירה מחושבת באופן פרטני, אך לעתים קרובות החיסכון בתמיכה מחזיר את עצמו תוך חודש. הזמינו הגירת Realm עכשיו וקבלו ערבות לבטיחות נתונים. צרו קשר — נעריך את הפרויקט שלכם תוך יום עסקים אחד.
טעויות נפוצות בהגירת Realm (וכיצד להימנע מהן)
- שכחת להגדיל את
price— האפליקציה קורסת לכל המשתמשים. ודא תמיד שהגרסה הוגדלה בלפחות 1. - דילוג על טיפול בשדות ניתנים לריק — נתונים הופכים ל-nil/null. השתמש ב-
migration.enumerateObjects(ofType: "Product") { old, new in let priceString = old?["priceString"] as? String ?? "0" new?["price"] = Double(priceString) ?? 0.0 }להקצאה מפורשת. - שינוי שם שדה על ידי מחיקה והוספה — אובדן נתונים. השתמש תמיד ב-
.realm. - שימוש ב-SDK שונים באותו פרויקט (Java + Kotlin) — קונפליקט ספריות. בחר SDK אחד והיצמד אליו.
| שלב | פרטים | לוח זמנים |
|---|---|---|
| ניתוח | לימוד הסכמה הנוכחית, היסטוריית גרסאות, נתוני משתמשים | 0.5 יום |
| פיתוח | יצירת הגירות: הוספה, שינוי שם, שינוי סוגים | יום אחד |
| בדיקות | אימות על Realm Studio, בדיקות יחידה, בדיקות אינטגרציה | יום אחד |
| תיעוד | תיאור השינויים ומתן הוראות לצוות | 0.5 יום |
לוחות זמנים: מיום אחד להגירות פשוטות ועד 3 ימים למעברים מורכבים רב-שלביים. נעריך את הפרויקט שלכם. קבלו ייעוץ להגירת Realm עוד היום — צרו קשר ואנו נציע את הפתרון האופטימלי.







