เมื่อใช้ ไลบรารีการคงอยู่ของข้อมูล Room เพื่อจัดเก็บข้อมูลของแอป คุณจะ กำหนดเอนทิตีเพื่อแสดงออบเจ็กต์ที่ต้องการจัดเก็บ โดยแต่ละเอนทิตีจะสอดคล้องกับตารางในฐานข้อมูล Room ที่เชื่อมโยง และแต่ละอินสแตนซ์ของเอนทิตีจะแสดงแถวของข้อมูลในตารางที่เกี่ยวข้อง
การใช้เอนทิตี Room ช่วยให้คุณกำหนดสคีมาของฐานข้อมูล ได้โดยไม่ต้องเขียนโค้ด SQL
โครงสร้างของเอนทิตี
คุณกำหนดเอนทิตี Room แต่ละรายการเป็นคลาสที่มีคำอธิบายประกอบ @Entity เอนทิตี Room
จะมีพร็อพเพอร์ตี้สำหรับแต่ละคอลัมน์ในตารางที่เกี่ยวข้องใน
ฐานข้อมูล ซึ่งรวมถึงคอลัมน์อย่างน้อย 1 คอลัมน์ที่ประกอบกันเป็นคีย์หลัก
โค้ดต่อไปนี้เป็นตัวอย่างของเอนทิตีที่กำหนดตาราง User ที่มีคอลัมน์สำหรับรหัส ชื่อ และนามสกุล
@Entity data class User( @PrimaryKey val id: Int, val firstName: String, val lastName: String )
โดยค่าเริ่มต้น Room จะใช้ชื่อคลาสเป็นชื่อตารางฐานข้อมูล หากต้องการให้ตารางมีชื่ออื่น ให้ตั้งค่าพร็อพเพอร์ตี้ ของคำอธิบายประกอบtableName@Entity ในทำนองเดียวกัน โดยค่าเริ่มต้น Room จะใช้ชื่อพร็อพเพอร์ตี้เป็นชื่อคอลัมน์ในฐานข้อมูล หากต้องการให้คอลัมน์มีชื่ออื่น ให้เพิ่มคำอธิบายประกอบ
@ColumnInfo ลงในพร็อพเพอร์ตี้ แล้วตั้งค่าพร็อพเพอร์ตี้ name
ตัวอย่างต่อไปนี้แสดงชื่อที่กำหนดเองสำหรับตารางและคอลัมน์
@Entity(tableName = "users") data class User( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String )
กำหนดคีย์หลัก
คุณต้องกำหนดคีย์หลักสำหรับเอนทิตี Room แต่ละรายการเพื่อ
ระบุแต่ละแถวในตารางฐานข้อมูลที่เกี่ยวข้องอย่างไม่ซ้ำกัน โดยใส่คำอธิบายประกอบ @PrimaryKey ในคอลัมน์เดียว
@PrimaryKey val id: Int
กำหนดคีย์หลักแบบผสม
หากต้องการให้ระบบระบุอินสแตนซ์ของเอนทิตีอย่างไม่ซ้ำกันด้วยการรวมคอลัมน์หลายคอลัมน์ คุณสามารถกำหนด คีย์หลักแบบผสม ได้โดยระบุคอลัมน์เหล่านั้นในพร็อพเพอร์ตี้ primaryKeys ของ @Entity
@Entity(primaryKeys = ["firstName", "lastName"]) data class User( val firstName: String, val lastName: String )
ละเว้นพร็อพเพอร์ตี้
โดยค่าเริ่มต้น Room จะสร้างคอลัมน์สำหรับแต่ละพร็อพเพอร์ตี้ที่กำหนดไว้ในเอนทิตี
หากต้องการป้องกันไม่ให้ Room คงอยู่พร็อพเพอร์ตี้ ให้ใส่คำอธิบายประกอบ @Ignore ในพร็อพเพอร์ตี้
@Entity data class User( @PrimaryKey val id: Int, val firstName: String, val lastName: String, @Ignore val picture: Bitmap? = null )
หากเอนทิตีรับช่วงพร็อพเพอร์ตี้จากเอนทิตีหลัก ให้ใช้
ignoredColumns property of the @Entity annotation:
open class User { var picture: Bitmap? = null } @Entity(ignoredColumns = ["picture"]) data class RemoteUser( @PrimaryKey val id: Int, val hasVpn: Boolean ) : User()
ให้การรองรับการค้นหาตาราง
Room รองรับคำอธิบายประกอบหลายรายการที่ช่วยให้คุณค้นหารายละเอียดในตารางฐานข้อมูลได้
รองรับการค้นหาข้อความแบบเต็ม
หากแอปต้องใช้การค้นหาข้อความแบบเต็ม (FTS) อย่างรวดเร็ว ให้สำรองข้อมูลเอนทิตีด้วยตารางเสมือน ใช้ส่วนขยาย FTS3 หรือ FTS4 SQLite หรือ ส่วนขยาย FTS5 SQLite
หากต้องการใช้ความสามารถนี้ ให้เพิ่มคำอธิบายประกอบ @Fts3, @Fts4 หรือ @Fts5
ลงในเอนทิตี
// Use `@Fts3` only if your app has strict disk space requirements. @Fts4 @Entity(tableName = "users") data class User( // Specifying a primary key for an FTS-table-backed entity is optional, // but if you include one, it must an INTEGER type and column name "rowid". @PrimaryKey @ColumnInfo(name = "rowid") val id: Long, @ColumnInfo(name = "first_name") val firstName: String )
หากต้องการปรับแต่งวิธีแยกข้อมูลฐานข้อมูลออกเป็นโทเค็นในตาราง FTS ให้ใช้ตัวเลือก tokenizer Room มีตัวแยกโทเค็นในตัวหลายรายการผ่าน
FtsOptions ซึ่งรวมถึง TOKENIZER_SIMPLE, TOKENIZER_PORTER และ
TOKENIZER_UNICODE61
@Fts4(tokenizer = FtsOptions.TOKENIZER_UNICODE61) @Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "rowid") val id: Long, @ColumnInfo(name = "first_name") val firstName: String )
Room มีตัวเลือกอื่นๆ อีกหลายรายการสำหรับการกำหนดเอนทิตีที่สำรองข้อมูลด้วย FTS ซึ่งรวมถึงการจัดลำดับผลลัพธ์ การนำดัชนีออกจากคอลัมน์ และตารางที่จัดการเป็นเนื้อหาภายนอก ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ได้ที่ข้อมูลอ้างอิง FtsOptions
จัดทำดัชนีคอลัมน์ที่เฉพาะเจาะจง
หากคุณใช้ AndroidSQLiteDriver และต้องรองรับ SDK
เวอร์ชันที่ไม่รองรับเอนทิตีที่สำรองข้อมูลด้วยตาราง FTS3, FTS4 หรือ FTS5 คุณ
ยังคงจัดทำดัชนีคอลัมน์บางคอลัมน์ในฐานข้อมูลเพื่อเพิ่มความเร็วในการค้นหาได้ หาก
คุณใช้ BundledSQLiteDriver Room จะรองรับ FTS ทุกเวอร์ชัน
ไม่ว่า Android SDK จะเป็นเวอร์ชันใดก็ตาม
หากต้องการเพิ่มดัชนีลงในเอนทิตี ให้ใส่indices พร็อพเพอร์ตี้ใน
@Entity คำอธิบายประกอบ ระบุชื่อคอลัมน์ที่จะรวมไว้ในดัชนีหรือดัชนีแบบผสม ข้อมูลโค้ดต่อไปนี้แสดงวิธีเพิ่มดัชนี
@Entity(indices = [Index(value = ["last_name", "address"])]) data class User( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String, val address: String?, )
บางครั้งคอลัมน์หรือกลุ่มคอลัมน์บางรายการในฐานข้อมูลต้องมีค่าที่ไม่ซ้ำกัน หากต้องการบังคับใช้ความไม่ซ้ำกันนี้ ให้ตั้งค่าพร็อพเพอร์ตี้ unique ของ
คำอธิบายประกอบ @Index เป็น true ตัวอย่างโค้ดต่อไปนี้แสดงวิธีบังคับใช้ความไม่ซ้ำกันนี้
@Entity(indices = [Index(value = ["first_name", "last_name"], unique = true)]) data class User( @PrimaryKey val id: Int, @ColumnInfo(name = "first_name") val firstName: String, @ColumnInfo(name = "last_name") val lastName: String, )