ห้องพักไม่ไม่ได้2.1.0-alpha03
มีดีระบบการโยกย้ายอย่างน้อยไม่ได้จนกว่า
ดังนั้นจนกว่าเราจะมีระบบการย้ายข้อมูลที่ดีขึ้นมีวิธีแก้ปัญหาบางประการเพื่อให้การย้ายข้อมูลในห้องทำได้ง่าย
เนื่องจากไม่มีวิธีการเช่น@Database(createNewTables = true)
หรือMigrationSystem.createTable(User::class)
ซึ่งควรมีอย่างใดอย่างหนึ่งวิธีเดียวที่เป็นไปได้คือการทำงาน
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
ภายในmigrate
วิธีการของคุณ
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
เพื่อให้เหนือสคริปต์SQLคุณมี 4 วิธี
1. เขียนด้วยตัวเอง
โดยทั่วไปคุณต้องเขียนสคริปต์ด้านบนที่จะตรงกับสคริปต์ที่สร้างห้อง วิธีนี้เป็นไปได้ไม่เป็นไปได้ (พิจารณาว่าคุณมี 50 ช่อง)
2. ส่งออกสคีมา
หากคุณรวมexportSchema = true
ไว้ใน@Database
คำอธิบายประกอบของคุณห้องจะสร้างสคีมาฐานข้อมูลภายใน / สกีมาของโฟลเดอร์โครงการของคุณ ลักษณะการใช้งานคือ
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
}
ตรวจสอบให้แน่ใจว่าคุณได้รวมบรรทัดด้านล่างในbuild.grade
โมดูลแอพของคุณแล้ว
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
เมื่อคุณเรียกใช้หรือสร้างโปรเจ็กต์คุณจะได้รับไฟล์ JSON 2.json
ซึ่งมีคำค้นหาทั้งหมดในฐานข้อมูล Room ของคุณ
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
ดังนั้นคุณสามารถรวมวิธีการข้างต้นไว้createSql
ในmigrate
วิธีการของคุณ
3. รับแบบสอบถามจาก AppDatabase_Impl
หากคุณไม่ต้องการส่งออกสคีมาคุณยังสามารถรับแบบสอบถามได้โดยการเรียกใช้หรือสร้างโครงการซึ่งจะสร้างAppDatabase_Impl.java
ไฟล์ และภายในไฟล์ที่ระบุคุณสามารถมีได้
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
ภายในcreateAllTables
เมธอดจะมีสคริปต์สร้างของเอนทิตีทั้งหมด คุณสามารถรับได้และรวมไว้ในmigrate
วิธีการของคุณ
4. การประมวลผลคำอธิบายประกอบ
อย่างที่คุณคาดเดา Room จะสร้างสิ่งที่กล่าวมาข้างต้นschema
ทั้งหมดและAppDatabase_Impl
ไฟล์ภายในเวลารวบรวมและด้วยการประมวลผลคำอธิบายประกอบที่คุณเพิ่มด้วย
kapt "androidx.room:room-compiler:$room_version"
นั่นหมายความว่าคุณสามารถทำเช่นเดียวกันและสร้างไลบรารีการประมวลผลคำอธิบายประกอบของคุณเองซึ่งจะสร้างการสืบค้นสร้างที่จำเป็นทั้งหมดสำหรับคุณ
ความคิดที่จะทำให้ห้องสมุดการประมวลผลคำอธิบายประกอบคำอธิบายประกอบห้องพักของและ@Entity
@Database
ใช้ชั้นเรียนที่มีคำอธิบายประกอบ@Entity
เช่น นี่คือขั้นตอนที่คุณจะต้องปฏิบัติตาม
- สร้างใหม่
StringBuilder
และต่อท้าย "CREATE TABLE IF NOT EXISTS"
- ได้รับชื่อของตารางทั้งจาก
class.simplename
หรือโดยการด้านการtableName
@Entity
เพิ่มลงในไฟล์StringBuilder
- จากนั้นสำหรับแต่ละฟิลด์ในชั้นเรียนของคุณให้สร้างคอลัมน์ของ SQL ใช้ชื่อประเภทความว่างเปล่าของฟิลด์โดยตัวฟิลด์เองหรือตาม
@ColumnInfo
คำอธิบายประกอบ สำหรับทุกฟิลด์คุณต้องเพิ่มid INTEGER NOT NULL
สไตล์ของคอลัมน์ให้กับStringBuilder
ไฟล์.
- เพิ่มคีย์หลักโดย
@PrimaryKey
- เพิ่ม
ForeignKey
และIndices
ถ้ามี
- หลังจากเสร็จสิ้นการแปลงเป็นสตริงและบันทึกในคลาสใหม่ที่คุณต้องการใช้ ตัวอย่างเช่นบันทึกไว้ด้านล่าง
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
จากนั้นคุณสามารถใช้เป็นไฟล์
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
ฉันสร้างห้องสมุดดังกล่าวสำหรับตัวเองซึ่งคุณสามารถเช็คเอาต์และใช้ในโครงการของคุณได้ด้วย โปรดทราบว่าไลบรารีที่ฉันสร้างขึ้นไม่เต็มและเป็นไปตามข้อกำหนดของฉันสำหรับการสร้างตาราง
RoomExtension เพื่อการโยกย้ายที่ดีขึ้น
แอปพลิเคชันที่ใช้ RoomExtension
หวังว่าจะเป็นประโยชน์
อัปเดต
เมื่อเขียนคำตอบนี้เวอร์ชันห้องคือ2.1.0-alpha03
และเมื่อฉันส่งอีเมลถึงนักพัฒนาซอฟต์แวร์ฉันได้รับคำตอบ
คาดว่าจะมีระบบการโยกย้ายที่ดีขึ้นใน 2.2.0
น่าเสียดายที่เรายังขาดระบบการย้ายข้อมูลที่ดีกว่า