מעבר מ-SQLite לחדר

לספריית מתמידים של חדר יש כמה יתרונות על פני השימוש ב-SQLite ממשקי API באופן ישיר:

  • אימות-זמן של שאילתות SQL
  • הערות נוחות שממזערות בקשות סטנדרטיות שחוזרות על עצמן או שעלולות לגרום לשגיאות. קוד
  • נתיבי העברה יעילים יותר של מסדי נתונים

אם האפליקציה שלך משתמשת כרגע בהטמעה של SQLite מחוץ לחדר, כדאי לקרוא את הדף הזה. כדי ללמוד איך להעביר את האפליקציה לש��מוש בחדר. אם 'חדר' הוא הראשון ההטמעה של SQLite שבה אתם משתמשים באפליקציה. מידע נוסף זמין במאמר שמירת נתונים בקובץ מקומי מסד נתונים באמצעות Room בשביל מידע בסיסי על שימוש.

שלבי ההעברה

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

עדכון יחסי התלות

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

עדכון סיווגי המודלים לישויות נתונים

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

  1. צריך להוסיף הערות להצהרת הכיתה עם @Entity כדי לציין ש- ישות החדר. אפשר גם להשתמש tableName נכס כדי מציינים שהשם של הטבלה שמתקבלת שונה מ- שם הכיתה.
  2. מוסיפים הערות לשדה המפתח הראשי עם @PrimaryKey
  3. אם אחת מהעמודות בטבלה שמתקבלת צריכה להיות בעלת שם שונה מהשם של השדה התואם, מוסיפים הערות לשדה עם @ColumnInfo ומגדירים את name לנכס השם הנכון של העמודה.
  4. אם בכיתה יש שדות שאתם לא רוצים שיישמרו במסד הנתונים, להוסיף הערות לשדות האלה @Ignore כדי לציין שהחדר לא ליצור עבורם עמודות בטבלה המתאימה.
  5. אם למחלקה יש יותר משיטה אחת של בנאי, מציינים איזה constructor כדי להשתמש בחדר, צריך להוסיף הערות לכל הבנאים האחרים באמצעות @Ignore.

Kotlin

@Entity(tableName = "users")
data class User(
  @PrimaryKey
  @ColumnInfo(name = "userid") val mId: String,
  @ColumnInfo(name = "username") val mUserName: String?,
  @ColumnInfo(name = "last_update") val mDate: Date?,
)

Java

@Entity(tableName = "users")
public class User {

  @PrimaryKey
  @ColumnInfo(name = "userid")
  private String mId;

  @ColumnInfo(name = "username")
  private String mUserName;

  @ColumnInfo(name = "last_update")
  private Date mDate;

  @Ignore
  public User(String userName) {
    mId = UUID.randomUUID().toString();
    mUserName = userName;
    mDate = new Date(System.currentTimeMillis());
  }

  public User(String id, String userName, Date date) {
    this.mId = id;
    this.mUserName = userName;
    this.mDate = date;
  }

}

יצירת DAOs

החדר משתמש באובייקטים של גישה לנתונים (DAOs) כדי להגדיר methods לגישה למסד הנתונים. פועלים לפי ההנחיות שמפורטות במאמר גישה לנתונים באמצעות 'חדר'. DAOs שיחליפו את השאילתה הקיימת עם DAOs.

יצירת מחלקה של מסד נתונים

הטמעות של Room משתמשות במחלקה של מסד נתונים כדי לנהל מכונה של מסד נתונים. המחלקה של מסד הנתונים אמורה להאריך RoomDatabase והתייחסות לכל של הישויות ו-DAO שהגדרתם.

Kotlin

@Database(entities = [User::class], version = 2)
@TypeConverters(DateConverter::class)
abstract class UsersDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Java

@Database(entities = {User.class}, version = 2)
@TypeConverters(DateConverter.class)
public abstract class UsersDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

להגדיר נתיב העברה

מכיוון שמספר הגרסה של מסד הנתונים משתנה, עליכם להגדיר Migration אובייקט כדי לציין נתיב העברה, כדי ש- Room ישמור את הנתונים הקיימים במסד הנתונים. כל עוד הסכימה של מסד הנתונים לא משתנה, השדה הזה יכול להיות ריק יישום בפועל.

Kotlin

val MIGRATION_1_2 = object : Migration(1, 2) {
  override fun migrate(database: SupportSQLiteDatabase) {
    // Empty implementation, because the schema isn't changing.
  }
}

Java

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    // Empty implementation, because the schema isn't changing.
  }
};

למידע נוסף על נתיבי העברה של מסדי נתונים בחדר, אפשר לעיין במאמר העברת מסד נתונים.

עדכון היצירה של מסד הנתונים

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

Kotlin

val db = Room.databaseBuilder(
          applicationContext,
          AppDatabase::class.java, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build()

Java

db = Room.databaseBuilder(
          context.getApplicationContext(),
          UsersDatabase.class, "database-name"
        )
          .addMigrations(MIGRATION_1_2).build();

בדיקת ההטמעה

חשוב לוודא שאתם בודקים את ההטמעה החדשה של החדר:

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

מיגרציה מצטברת

אם האפליקציה משתמשת במסד נתונים גדול ומורכב, ייתכן שלא ניתן יהיה להעביר אותה להעביר את האפליקציה לחדר. במקום זאת, אפשר להטמיע את הנתונים בשלב הראשון, ומסד הנתונים של Room, ואז מעבירים את שיטות השאילתה ל-DAOs מאוחר יותר. כדי לעשות זאת, עליך להחליף את ה-database helper המותאם אישית שלך class עם הפונקציה SupportSQLiteOpenHelper שקיבלתם RoomDatabase.getOpenHelper().

מקורות מידע נוספים

לקבלת מידע נוסף על מיגרציה מ-SQLite ל- Room, אפשר לעיין במקורות הבאים: משאבים:

בלוגים