ป้อนข้อมูลฐานข้อมูลห้องล่วงหน้า

บางครั้งคุณอาจต้องการให้แอปเริ่มต้นด้วยฐานข้อมูลที่มีอยู่แล้ว ซึ่งโหลดด้วยชุดข้อมูลที่เฉพาะเจาะจง วิธีนี้เรียกว่าการป้อนข้อมูลล่วงหน้าในฐานข้อมูล ในห้อง 2.2.0 ขึ้นไป คุณสามารถใช้เมธอด API เพื่อป้อนข้อมูลฐานข้อมูลของห้องล่วงหน้าได้ เริ่มต้นได้ด้วยเนื้อหาจากไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าใน ระบบไฟล์

ป้อนข้อมูลล่วงหน้าจากชิ้นงานแอป

หากต้องการเติมข้อมูลฐานข้อมูลห้องล่วงหน้าจากไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ ที่ใดก็ได้ในไดเรกทอรี assets/ ของแอป ให้เรียกใช้ createFromAsset() จากออบเจ็กต์ RoomDatabase.Builder ก่อนเรียกใช้ build():

Kotlin

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build()

Java

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build();

เมธอด createFromAsset() จะยอมรับอาร์กิวเมนต์สตริงที่มี เส้นทางแบบสัมพัทธ์จากไดเรกทอรี assets/ ไปยังไฟล์ฐานข้อมูลที่มีการจัดแพ็กเกจล่วงหน้า

ป้อนข้อมูลล่วงหน้าจากระบบไฟล์

หากต้องการเติมข้อมูลฐานข้อมูลห้องล่วงหน้าจากไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ ที่ใดก็ได้ในระบบไฟล์ของอุปกรณ์ ยกเว้นไดเรกทอรี assets/ ของแอป เรียกเมธอด createFromFile() จากออบเจ็กต์ RoomDatabase.Builder ของคุณ ก่อนโทรหา build()

Kotlin

Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromFile(File("mypath"))
    .build()

Java

Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromFile(new File("mypath"))
    .build();

เมธอด createFromFile() ยอมรับอาร์กิวเมนต์ File สำหรับฟังก์ชัน ไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า ห้องแชทจะสร้างสำเนาของไฟล์ที่กำหนดแทน แทนที่จะเปิดแอปโดยตรง ดังนั้นโปรดตรวจสอบว่าแอปของคุณมีสิทธิ์อ่านใน

จัดการการย้ายข้อมูลที่มีฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า

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

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

ส่วนต่อไปนี้จะแสดงตัวอย่างเล็กๆ น้อยๆ ของวิธีดำเนินการดังกล่าว

ตัวอย่าง: การย้ายข้อมูลสำรองที่มีฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า

สมมติว่า

  • แอปของคุณกำหนดฐานข้อมูลห้องในเวอร์ชัน 3
  • อินสแตนซ์ฐานข้อมูลที่ติดตั้งไว้ในอุปกรณ์เป็นเวอร์ชัน 2
  • เวอร์ชัน 3 มีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า
  • ไม่มีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 2 เป็นเวอร์ชัน 3
  • เปิดใช้การย้ายข้อมูลแบบทำลายแล้ว

Kotlin

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build()

Java

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Destructive migrations are enabled and a prepackaged database
// is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .fallbackToDestructiveMigration()
    .build();

สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้

  1. เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 3 และฐานข้อมูล อินสแตนซ์ที่ติดตั้งอยู่ในอุปกรณ์ในเวอร์ชัน 2 แล้ว ตามความจำเป็น
  2. เนื่องจากไม่มีแผนการย้ายข้อมูลจากเวอร์ชัน 2 ไปเป็นเวอร์ชัน 3 การย้ายข้อมูลเป็นการย้ายข้อมูลสำรอง
  3. เนื่องจากเมธอดเครื่องมือสร้าง fallbackToDestructiveMigration() คือ ที่เรียกว่า การย้ายข้อมูลสำรองเป็นการทำลาย ห้องได้นำฐานข้อมูลออก ที่ติดตั้งในอุปกรณ์
  4. เนื่องจากมีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ในเวอร์ชัน 3 สร้างฐานข้อมูลอีกครั้งและเติมข้อมูลด้วยเนื้อหาของ ไฟล์ฐานข้อมูล ในทางกลับกัน หากคุณใช้ไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า เวอร์ชัน 2 ห้องจะแจ้งว่าไม่ตรงกับเวอร์ชันเป้าหมายและ จะไม่ใช้เป็นส่วนหนึ่งของการย้ายข้อมูลสำรอง

ตัวอย่าง: มีการย้ายข้อมูลโดยใช้ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า

สมมติว่าแอปของคุณใช้เส้นทางการย้ายข้อมูลจากเวอร์ชัน 2 ไปยัง เวอร์ชัน 3:

Kotlin

// Database class definition declaring version 3.
@Database(version = 3)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 2 to version 3.
val MIGRATION_2_3 = object : Migration(2, 3) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build()

Java

// Database class definition declaring version 3.
@Database(version = 3)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 2 to version 3.
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// A prepackaged database is provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_2_3)
    .build();

สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้

  1. เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 3 และฐานข้อมูล ติดตั้งบนอุปกรณ์เป็นเวอร์ชัน 2 แล้ว จำเป็นต้องมีการย้ายข้อมูล
  2. เนื่องจากมีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 2 ถึงเวอร์ชัน 3 ห้องแชทเรียกใช้เมธอด migrate() ที่กำหนดไว้เพื่ออัปเดตฐานข้อมูล ในอุปกรณ์เป็นเวอร์ชัน 3 โดยเก็บรักษาข้อมูลที่มีอยู่ใน ฐานข้อมูล Room ไม่ได้ใช้ไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าเนื่องจาก Room ใช้ไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าในกรณีของการย้ายข้อมูลสำรองเท่านั้น

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

ไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าอาจส่งผลต่อการย้ายข้อมูลที่ประกอบด้วยหลายไฟล์ ขั้นตอน ลองพิจารณากรณีต่อไปนี้

  • แอปของคุณกำหนดฐานข้อมูลห้องในเวอร์ชัน 4
  • อินสแตนซ์ฐานข้อมูลที่ติดตั้งไว้ในอุปกรณ์เป็นเวอร์ชัน 2
  • เวอร์ชัน 3 มีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้า
  • มีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 3 เป็นเวอร์ชัน 4 แต่ไม่มี จากเวอร์ชัน 2 เป็นเวอร์ชัน 3
  • เปิดใช้การย้ายข้อมูลแบบทำลายแล้ว

Kotlin

// Database class definition declaring version 4.
@Database(version = 4)
abstract class AppDatabase : RoomDatabase() {
    ...
}

// Migration path definition from version 3 to version 4.
val MIGRATION_3_4 = object : Migration(3, 4) {
    override fun migrate(database: SupportSQLiteDatabase) {
        ...
    }
}

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build()

Java

// Database class definition declaring version 4.
@Database(version = 4)
public abstract class AppDatabase extends RoomDatabase {
    ...
}

// Migration path definition from version 3 to version 4.
static final Migration MIGRATION_3_4 = new Migration(3, 4) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        ...
    }
};

// Destructive migrations are enabled and a prepackaged database is
// provided.
Room.databaseBuilder(appContext, AppDatabase.class, "Sample.db")
    .createFromAsset("database/myapp.db")
    .addMigrations(MIGRATION_3_4)
    .fallbackToDestructiveMigration()
    .build();

สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้

  1. เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 4 และฐานข้อมูล อินสแตนซ์ที่ติดตั้งอยู่ในอุปกรณ์ในเวอร์ชัน 2 แล้ว ตามความจำเป็น
  2. เนื่องจากไม่มีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 2 ถึงเวอร์ชัน 3 การย้ายข้อมูลเป็นการย้ายข้อมูลสำรอง
  3. เนื่องจากเมธอดเครื่องมือสร้าง fallbackToDestructiveMigration() คือ ที่เรียกว่า การย้ายข้อมูลสำรองเป็นการทำลาย ห้องได้นำฐานข้อมูลออก ในอุปกรณ์ได้
  4. เนื่องจากมีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ในเวอร์ชัน 3 สร้างฐานข้อมูลอีกครั้งและเติมข้อมูลด้วยเนื้อหาของ ไฟล์ฐานข้อมูล
  5. ขณะนี้ฐานข้อมูลที่ติดตั้งในอุปกรณ์เป็นเวอร์ชัน 3 เพราะนี่คือ ยังคงต่ำกว่าเวอร์ชันที่ระบุไว้ในแอปของคุณ การย้ายข้อมูลอีกครั้งคือ ตามความจำเป็น
  6. เนื่องจากมีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 3 ถึงเวอร์ชัน 4 ห้องแชทเรียกใช้เมธอด migrate() ที่กำหนดไว้เพื่ออัปเดตฐานข้อมูล ในอุปกรณ์เป็นเวอร์ชัน 4 โดยเก็บรักษาข้อมูลที่คัดลอก จากไฟล์ฐานข้อมูลที่จัดแพ็กเกจเวอร์ชัน 3 ไว้ล่วงหน้า

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

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการป้อนข้อมูลล่วงหน้าในฐานข้อมูลห้อง โปรดดูข้อมูลต่อไปนี้ ที่ไม่ซับซ้อน

วิดีโอ

บล็อก