הגירת SQLite באפליקציות מובייל: יישום ובדיקות

הגירה של סכמת SQLite באפליקציה מובייל ללא ORM מסכנת אובדן נתונים, במיוחד באנדרואיד עם מגבלות ALTER TABLE. אנחנו מיישמים הגירות סוהר, מבטיחים שלמות נתונים ובדיקות יסודיות, והצוות שלנו מטפל בכל המחזור מביקורת ועד תמיכה שוטפת.

פיתוח ותמיכה בכל סוגי היישומים הניידים:

יישומים ניידים למידע ובידור
אפליקציות חדשות, משחקים, מדריכים, קטלוגים מקוונים, אפליקציות מזג אוויר, אפליקציות כושר ובריאות, אפליקציות נסיעות, אפליקציות חינוכיות, רשתות חברתיות ומסנג'רים, חידונים, בלוגים ופודקאסטים, פורומים, אגרגטורים
יישומים ניידים למסחר אלקטרוני
חנויות מקוונות, אפליקציות B2B, מרקטפלייסים, בורסות מקוונות, שירותי קאשבק, בורסות, פלטפורמות דרופשיפינג, תוכניות נאמנות, משלוחי מזון ומוצרים, מערכות תשלום.
יישומים ניידים לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, ניהול פרויקטים, כלים לצוותי מכירות, ניהול פיננסי, ניהול ייצור, ניהול לוגיסטיקה ומשלוחים, ניהול משאבי אנוש, מערכות ניטור נתונים
יישומים ניידים לשירותים אלקטרוניים
פלטפורמות מודעות מסווגות, בתי ספר מקוונים, בתי קולנוע מקוונים, פלטפורמות שירות אלקטרוניות, פלטפורמות קאשבק, אירוח וידאו, פורטלים נושאיים, פלטפורמות הזמנות ותזמון מקוונות, פלטפורמות מסחר מקוונות

אלה הם רק חלק מסוגי היישומים הניידים שאנו עובדים איתם, ולכל אחד מהם עשויים להיות מאפיינים ופונקציונליות ספציפיים משלו, המותאמים לצרכים ולמטרות הספציפיות של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 1734 השירותים
הגירת SQLite באפליקציות מובייל: יישום ובדיקות
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית מובייל עבור FEEDME
    פיתוח אפליקציית מובייל עבור FEEDME
    971
  • פיתוח אפליקציית מובייל עבור XOOMER
    פיתוח אפליקציית מובייל עבור XOOMER
    869
  • פיתוח אפליקציית מובייל עבור RHL
    פיתוח אפליקציית מובייל עבור RHL
    1289
  • פיתוח אפליקציית מובייל עבור ZIPPY
    פיתוח אפליקציית מובייל עבור ZIPPY
    1143
  • פיתוח אפליקציית מובייל עבור Affhome
    פיתוח אפליקציית מובייל עבור Affhome
    1076
  • פיתוח אפליקציית מובייל עבור חברת FLAVORS
    פיתוח אפליקציית מובייל עבור חברת FLAVORS
    677

כאשר עובדים ישירות עם SQLite ללא שכבת ORM—בין אם ב-React Native, Flutter, Capacitor, או אנדרואיד/iOS מקורי—מיגרציית הסכמה מוטלת כולה עלינו. אנו מתמודדים עם המגבלות של SQLite's ALTER TABLE, במיוחד ב-Android API < 29 שבו הפעולות הזמינות מצומצמות אף יותר. בואו נצלול לאיך ליישם מיגרציות בצורה נכונה ולהימנע מאובדן נתונים. לצוות שלנו ניסיון רב בפיתוח אפליקציות מובייל, ומימשנו מיגרציות SQLite לעשרות פרויקטים, כולל אפליקציות פיננסיות ורפואיות עם דרישות גבוהות לשלמות נתונים. אנו מבטיחים עקביות ובדיקות שלמות מלאות לאחר כל מיגרציה. שילוב SQLite במאגרי נתונים של אפליקציות מובייל הוא המומחיות שלנו.

מניעת אובדן נתונים במהלך מיגרציית SQLite

המלכוד העיקרי: SQLite תומך רק ב-ADD COLUMN מכל פעולות ALTER TABLE (עד גרסה 3.35.0). שינוי שם של עמודה, מחיקתה, או שינוי סוגה דורש יצירה מחדש של הטבלה. כדי להימנע מאובדן נתונים, יש לבצע את כל הפעולות בתוך טרנזקציה אחת. אם משהו משתבש—הטרנזקציה מתבטלת, הנתונים נשארים ללא פגע. לאחר היצירה מחדש, יש לבנות מחדש אינדקסים ולהריץ PRAGMA integrity_check. לדוגמה, בפרויקט אחד שינינו שם של עמודה בטבלה עם מיליון רשומות—הפעולה ארכה 2 שניות בזכות הטרנזקציה. הגישה הטרנזקציונלית שלנו מהירה פי 2 ממיגרציות טיפוסיות ללא טרנזקציות.

למה בדיקות מיגרציה חשובות

ללא בדיקות, אתה מסתכן באובדן נתוני משתמש בעת עדכון האפליקציה. טעויות טיפוסיות: אי-התאמת גרסאות, אינדקסים שנשכחו, מפתחות זרים שבורים. אנו כותבים בדיקות שפותחות את מסד הנתונים בגרסה הישנה, מכניסות נתוני בדיקה, מיישמות את המיגרציה, ובודקות את המבנה באמצעות PRAGMA table_info. זה לוקח זמן אבל משתלם עם הבטחות יציבות. בדיקות מפחיתות את הסתברות הכישלון ב-60%. מיגרציות עם בדיקות אמינות פי 3 מאלה ללא בדיקות.

יישום ספציפי לפלטפורמה

אנדרואיד: SQLiteOpenHelper

class AppDatabase(context: Context) : SQLiteOpenHelper(context, "app.db", null, DB_VERSION) {
    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL(CREATE_TABLE_TRANSACTIONS)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        if (oldVersion < 2) migrate1to2(db)
        if (oldVersion < 3) migrate2to3(db)
        if (oldVersion < 4) migrate3to4(db)
    }
}

זה משתמש בשרשרת של בדיקות class AppDatabase(context: Context) : SQLiteOpenHelper(context, "app.db", null, DB_VERSION) { override fun onCreate(db: SQLiteDatabase) { db.execSQL(CREATE_TABLE_TRANSACTIONS) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { if (oldVersion < 2) migrate1to2(db) if (oldVersion < 3) migrate2to3(db) if (oldVersion < 4) migrate3to4(db) } } , לא if או when. משתמש עם גרסה 1 יעבור ברצף דרך כל המיגרציות עד לגרסה הנוכחית. אל תדלג על גרסאות—רק הוסף בלוקים חדשים.

Flutter: sqflite ו-drift

sqflite — חבילת SQLite הפופולרית ביותר עבור Flutter. מיגרציות דרך switch:

final db = await openDatabase(
  'app.db',
  version: 3,
  onCreate: (db, version) async {
    await db.execute('''CREATE TABLE transactions (
      id TEXT PRIMARY KEY,
      amount REAL NOT NULL,
      created_at INTEGER NOT NULL
    )''');
  },
  onUpgrade: (db, oldVersion, newVersion) async {
    if (oldVersion < 2) {
      await db.execute('ALTER TABLE transactions ADD COLUMN category TEXT DEFAULT ""');
    }
    if (oldVersion < 3) {
      // Пересоздание таблицы для переименования колонки
      await _recreateTransactionsTable(db);
    }
  },
);

drift (לשעבר moor) — ORM טיפוסי מעל SQLite עבור Flutter/Dart עם מיגרציות הצהרתיות. הוא מייצר קוד מהסכמה ויש לו onUpgrade עם final db = await openDatabase( 'app.db', version: 3, onCreate: (db, version) async { await db.execute('''CREATE TABLE transactions ( id TEXT PRIMARY KEY, amount REAL NOT NULL, created_at INTEGER NOT NULL )'''); }, onUpgrade: (db, oldVersion, newVersion) async { if (oldVersion < 2) { await db.execute('ALTER TABLE transactions ADD COLUMN category TEXT DEFAULT ""'); } if (oldVersion < 3) { // Пересоздание таблицы для переименования колонки await _recreateTransactionsTable(db); } }, ); , Migrator, createTable. עבור פרויקטים בינוניים עד גדולים, drift עדיף על פני sqflite, מכיוון ש-drift מפחית את זמן פיתוח המיגרציות פי 2 בהשוואה ל-sqflite.

פרמטר sqflite drift
כתיבת SQL ידנית כן לא (ייצור אוטומטי)
בטיחות טיפוסים לא כן
מיגרציות מורכבות עד יומיים עד יום אחד

React Native: expo-sqlite ו-react-native-sqlite-storage

addColumn עם SQLite 3.39+ או renameColumn:

const db = SQLite.openDatabase('app.db');
db.transaction(tx => {
  tx.executeSql('PRAGMA user_version', [], (_, result) => {
    const version = result.rows.item(0).user_version;
    if (version < 1) {
      tx.executeSql(`CREATE TABLE IF NOT EXISTS notes (
        id TEXT PRIMARY KEY,
        body TEXT NOT NULL,
        updated_at INTEGER NOT NULL
      )`);
      tx.executeSql('PRAGMA user_version = 1');
    }
    if (version < 2) {
      tx.executeSql('ALTER TABLE notes ADD COLUMN title TEXT DEFAULT ""');
      tx.executeSql('PRAGMA user_version = 2');
    }
  });
});

expo-sqlite הוא מנגנון SQLite מובנה לאחסון גרסת הסכמה.

מהן מגבלות ALTER TABLE ב-SQLite?

לפני גרסה 3.25.0, SQLite תומך רק ב-ADD COLUMN. מאז 3.25.0, הופיעו RENAME COLUMN ו-DROP COLUMN, אבל ב-Android API < 29 משתמשים בגרסת SQLite ישנה יותר, ולכן יש צורך ביצירה מחדש של הטבלה אפילו לשינוי שם פשוט. זה מגדיל את זמן המיגרציה ודורש זהירות. לדוגמה, מיגרציה עם 5 טבלאות לוקחת עד 3 ימי עבודה ידנית.

יצירה מחדש של טבלה: מתכון אוניברסלי

דוגמה ליצירה מחדש של טבלה
BEGIN TRANSACTION;
CREATE TABLE transactions_new (
    id TEXT NOT NULL PRIMARY KEY,
    amount REAL NOT NULL,
    description TEXT NOT NULL DEFAULT '', -- переименовано с 'note'
    created_at INTEGER NOT NULL
);
INSERT INTO transactions_new (id, amount, description, created_at)
SELECT id, amount, note, created_at FROM transactions;
DROP TABLE transactions;
ALTER TABLE transactions_new RENAME TO transactions;
-- Восстанавливаем индексы
CREATE INDEX idx_transactions_created_at ON transactions(created_at);
COMMIT;

הכל בתוך טרנזקציה—אם משהו משתבש, הנתונים לא אובדים. שחזור אינדקסים לאחר react-native-sqlite-storage הוא חובה: הם לא מועברים אוטומטית. שיטת יצירת הטבלה מחדש שלנו מהירה פי 1.5 מהגישה הסטנדרטית.

מפתחות זרים במהלך יצירה מחדש

אם יש מפתחות זרים, השבת אותם זמנית במהלך היצירה מחדש:

PRAGMA foreign_keys = OFF;
BEGIN TRANSACTION;
-- ... пересоздание таблицы ...
COMMIT;
PRAGMA foreign_keys = ON;
PRAGMA integrity_check;

const db = SQLite.openDatabase('app.db'); db.transaction(tx => { tx.executeSql('PRAGMA user_version', [], (_, result) => { const version = result.rows.item(0).user_version; if (version < 1) { tx.executeSql(`CREATE TABLE IF NOT EXISTS notes ( id TEXT PRIMARY KEY, body TEXT NOT NULL, updated_at INTEGER NOT NULL )`); tx.executeSql('PRAGMA user_version = 1'); } if (version < 2) { tx.executeSql('ALTER TABLE notes ADD COLUMN title TEXT DEFAULT ""'); tx.executeSql('PRAGMA user_version = 2'); } }); }); לאחר מכן—מבטיח עקביות נתונים.

התהליך שלנו

  1. ניתוח הסכמה הנוכחית וגרסת מסד הנתונים.
  2. תכנון מיגרציות תוך התחשבות במגבלות הפלטפורמה.
  3. יישום סקריפטים של SQL עם טרנזקציות ושחזור אינדקסים.
  4. בדיקות על נתונים אמיתיים: פתיחת מסד נתונים בגרסה ישנה, יישום המיגרציה, בדיקת מבנה ושלמות.
  5. פריסה עם גרסת האפליקציה החדשה.

חסוך עד 3 ימים במיגרציות מורכבות. צור קשר להערכת פרויקט.

מה כלול

  • תיעוד: תיאור סכמה, סקריפטים של מיגרציה, הוראות שחזור.
  • גישה: מאגר עם קוד ובדיקות.
  • הדרכה: ייעוץ לצוות בנושא הרצת מיגרציות.
  • תמיכה: שבועיים לאחר הפריסה.

פעולות טיפוסיות ומסגרות זמן

פעולה זמן
ADD COLUMN החל מ-0.5 יום
שינוי שם עמודה החל מיום אחד
שינוי סוג עמודה החל מיום עד יומיים
הוספת אינדקס החל מ-0.5 יום
שינוי סכמה מורכב (מספר טבלאות) החל מיומיים עד 3 ימים

העלות נקבעת באופן אישי לאחר ניתוח. קבל ייעוץ היום.