บางครั้งคุณอาจต้องการให้แอปเริ่มต้นด้วยฐานข้อมูลที่มีอยู่แล้ว ซึ่งโหลดด้วยชุดข้อมูลที่เฉพาะเจาะจง วิธีนี้เรียกว่าการป้อนข้อมูลล่วงหน้าในฐานข้อมูล ในห้อง 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();
สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้
- เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 3 และฐานข้อมูล อินสแตนซ์ที่ติดตั้งอยู่ในอุปกรณ์ในเวอร์ชัน 2 แล้ว ตามความจำเป็น
- เนื่องจากไม่มีแผนการย้ายข้อมูลจากเวอร์ชัน 2 ไปเป็นเวอร์ชัน 3 การย้ายข้อมูลเป็นการย้ายข้อมูลสำรอง
- เนื่องจากเมธอดเครื่องมือสร้าง
fallbackToDestructiveMigration()
คือ ที่เรียกว่า การย้ายข้อมูลสำรองเป็นการทำลาย ห้องได้นำฐานข้อมูลออก ที่ติดตั้งในอุปกรณ์ - เนื่องจากมีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ในเวอร์ชัน 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();
สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้
- เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 3 และฐานข้อมูล ติดตั้งบนอุปกรณ์เป็นเวอร์ชัน 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();
สิ่งที่จะเกิดขึ้นในสถานการณ์ดังกล่าวมีดังนี้
- เนื่องจากฐานข้อมูลที่กำหนดไว้ในแอปเป็นเวอร์ชัน 4 และฐานข้อมูล อินสแตนซ์ที่ติดตั้งอยู่ในอุปกรณ์ในเวอร์ชัน 2 แล้ว ตามความจำเป็น
- เนื่องจากไม่มีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 2 ถึงเวอร์ชัน 3 การย้ายข้อมูลเป็นการย้ายข้อมูลสำรอง
- เนื่องจากเมธอดเครื่องมือสร้าง
fallbackToDestructiveMigration()
คือ ที่เรียกว่า การย้ายข้อมูลสำรองเป็นการทำลาย ห้องได้นำฐานข้อมูลออก ในอุปกรณ์ได้ - เนื่องจากมีไฟล์ฐานข้อมูลที่จัดแพ็กเกจไว้ล่วงหน้าซึ่งอยู่ในเวอร์ชัน 3 สร้างฐานข้อมูลอีกครั้งและเติมข้อมูลด้วยเนื้อหาของ ไฟล์ฐานข้อมูล
- ขณะนี้ฐานข้อมูลที่ติดตั้งในอุปกรณ์เป็นเวอร์ชัน 3 เพราะนี่คือ ยังคงต่ำกว่าเวอร์ชันที่ระบุไว้ในแอปของคุณ การย้ายข้อมูลอีกครั้งคือ ตามความจำเป็น
- เนื่องจากมีเส้นทางการย้ายข้อมูลที่ใช้งานจากเวอร์ชัน 3 ถึงเวอร์ชัน 4
ห้องแชทเรียกใช้เมธอด
migrate()
ที่กำหนดไว้เพื่ออัปเดตฐานข้อมูล ในอุปกรณ์เป็นเวอร์ชัน 4 โดยเก็บรักษาข้อมูลที่คัดลอก จากไฟล์ฐานข้อมูลที่จัดแพ็กเกจเวอร์ชัน 3 ไว้ล่วงหน้า
แหล่งข้อมูลเพิ่มเติม
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการป้อนข้อมูลล่วงหน้าในฐานข้อมูลห้อง โปรดดูข้อมูลต่อไปนี้ ที่ไม่ซับซ้อน
วิดีโอ
- มีอะไรใหม่ในห้อง (Android Dev Summit ปี 2019)