ย้ายข้อมูลจาก SQLite ไปยังห้องแชท

ไลบรารีความต่อเนื่องของห้องมีประโยชน์หลายอย่างมากกว่าการใช้ SQLite API โดยตรง:

  • การยืนยันเวลาคอมไพล์ของการค้นหา SQL
  • คําอธิบายประกอบตามความสะดวกเพื่อลดต้นแบบที่ซ้ำกันและมีโอกาสเกิดข้อผิดพลาดได้ง่าย รหัส
  • เส้นทางการย้ายข้อมูลฐานข้อมูลที่มีประสิทธิภาพ

หากแอปของคุณใช้ SQLite แบบที่ไม่ใช่ห้องในตอนนี้ โปรดอ่านหน้านี้ เพื่อดูวิธีย้ายข้อมูลแอปไปใช้ห้องแชทแทน หากห้องแชทเป็นรายการแรก การใช้งาน SQLite ที่คุณใช้ในแอป โปรดดูที่บันทึกข้อมูลในเครื่อง ฐานข้อมูลที่ใช้ Room สำหรับข้อมูลการใช้งานพื้นฐาน

ขั้นตอนการย้ายข้อมูล

ทำตามขั้นตอนต่อไปนี้เพื่อย้ายข้อมูลการใช้งาน SQLite ไปยังห้องแชท ถ้า การใช้งาน SQLite ใช้ฐานข้อมูลขนาดใหญ่หรือการค้นหาที่ซับซ้อน ต้องการทยอยย้ายไปยังห้องแชททีละน้อย ดูการย้ายข้อมูลที่เพิ่มขึ้น เพื่อเพิ่มกลยุทธ์การย้ายข้อมูล

อัปเดตทรัพยากร Dependency

หากต้องการใช้ Room ในแอป คุณต้องระบุทรัพยากร Dependency ที่เหมาะสมไว้ใน build.gradle ของแอป ดูการตั้งค่าสำหรับ ทรัพยากร Dependency ของห้องล่าสุด

อัปเดตคลาสของโมเดลในเอนทิตีข้อมูล

ห้องแชทใช้เอนทิตีข้อมูลเพื่อ แสดงตารางในฐานข้อมูล คลาสเอนทิตีแต่ละคลาสจะแสดงแทนตารางและ มีช่องที่แสดงคอลัมน์ในตารางนั้น ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดต คลาสโมเดลที่มีอยู่ให้เป็นเอนทิตีห้องแชท

  1. เขียนคำอธิบายประกอบประกาศชั้นเรียนด้วย @Entity เพื่อระบุว่าเป็น เอนทิตีห้อง คุณสามารถเลือกใช้ tableName ไปยัง ให้ระบุว่าตารางผลลัพธ์ควรมีชื่อที่ต่างจาก ชื่อชั้นเรียน
  2. ใส่คำอธิบายประกอบให้กับฟิลด์คีย์หลักด้วย @PrimaryKey
  3. หากคอลัมน์ใดๆ ในตารางผลลัพธ์ควรมีชื่อที่ แตกต่างจากชื่อของฟิลด์ที่ตรงกัน ให้ใส่คำอธิบายประกอบฟิลด์ด้วย @ColumnInfo และตั้งค่า name พร็อพเพอร์ตี้ไปยัง ชื่อคอลัมน์ที่ถูกต้อง
  4. หากคลาสมีฟิลด์ที่คุณไม่ต้องการให้คงอยู่ในฐานข้อมูล ใส่คำอธิบายประกอบในช่องเหล่านั้นด้วย @Ignore เพื่อแสดงห้องนั้น ไม่ควรสร้างคอลัมน์ให้กับคอลัมน์ในตารางที่เกี่ยวข้อง
  5. ถ้าคลาสมีเมธอดตัวสร้างมากกว่า 1 วิธี ให้ระบุตัวสร้าง ควรใช้ห้องโดยใส่ @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;
  }

}

สร้าง DAO

Room ใช้ออบเจ็กต์การเข้าถึงข้อมูล (DAO) เพื่อกำหนดเมธอดในการเข้าถึงฐานข้อมูล ทำตามคำแนะนำในหัวข้อการเข้าถึงข้อมูลโดยใช้ห้องแชท DAO เพื่อแทนที่การค้นหาที่มีอยู่ ด้วย DAO

สร้างคลาสฐานข้อมูล

การใช้งาน 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 ออบเจ็กต์ ระบุเส้นทางการย้ายข้อมูลเพื่อให้ห้องแชทเก็บข้อมูลที่มีอยู่แล้วในฐานข้อมูล ตราบใดที่สคีมาของฐานข้อมูลไม่มีการเปลี่ยนแปลง ค่านี้อาจว่างเปล่า การใช้งานของคุณ

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 ในภายหลัง คุณสามารถทำได้โดยแทนที่ตัวช่วยฐานข้อมูลที่กำหนดเองของคุณ ด้วยฟังก์ชัน SupportSQLiteOpenHelper ที่คุณได้รับจาก RoomDatabase.getOpenHelper()

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการย้ายข้อมูลจาก SQLite ไปยังห้องแชทได้ที่หัวข้อเพิ่มเติมต่อไปนี้ แหล่งข้อมูล:

บล็อก