Phòng không không có một tốt Hệ thống di cư, ít nhất là không cho đến khi2.1.0-alpha03
.
Vì vậy, cho đến khi chúng tôi có Hệ thống di chuyển tốt hơn, có một số cách giải quyết để có thể di chuyển dễ dàng trong phòng.
Vì không có phương pháp nào như @Database(createNewTables = true)
hoặc MigrationSystem.createTable(User::class)
, phải có phương pháp này hoặc phương pháp khác, cách duy nhất có thể là chạy
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
bên trong migrate
phương pháp của bạn .
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`))")
}
}
Để đạt được trên SQL script , bạn có 4 cách
1. Viết bởi chính bạn
Về cơ bản, bạn phải viết script ở trên sẽ khớp với script mà Room tạo ra. Cách này khả thi, không khả thi. (Coi như bạn có 50 trường)
2. Lược đồ xuất khẩu
Nếu bạn bao gồm exportSchema = true
bên trong @Database
chú thích của mình , Room sẽ tạo lược đồ cơ sở dữ liệu trong / các lược đồ của thư mục dự án của bạn. Cách sử dụng là
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
Đảm bảo rằng bạn đã bao gồm các dòng dưới đây trong build.grade
mô-đun ứng dụng của mình
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Khi bạn chạy hoặc xây dựng dự án, bạn sẽ nhận được tệp JSON 2.json
, tệp này có tất cả các truy vấn trong cơ sở dữ liệu Phòng của bạn.
"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
},
Vì vậy, bạn có thể bao gồm những điều trên createSql
trong migrate
phương pháp của bạn .
3. Nhận truy vấn từ AppDatabase_Impl
Nếu bạn không muốn xuất lược đồ, bạn vẫn có thể nhận được truy vấn bằng cách chạy hoặc xây dựng dự án sẽ tạo AppDatabase_Impl.java
tệp. và trong tệp được chỉ định mà bạn có thể có.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
Trong createAllTables
phương thức, sẽ có các kịch bản tạo của tất cả các thực thể. Bạn có thể lấy nó và đưa vào bên trong bạnmigrate
phương pháp của .
4. Xử lý chú thích.
Như bạn có thể đoán, Room tạo tất cả các tệp được đề cập ở trên schema
và AppDatabase_Impl
các tệp trong thời gian biên dịch và với Xử lý chú thích mà bạn thêm vào
kapt "androidx.room:room-compiler:$room_version"
Điều đó có nghĩa là bạn cũng có thể làm như vậy và tạo thư viện xử lý chú thích của riêng bạn để tạo tất cả các truy vấn tạo cần thiết cho bạn.
Ý tưởng là tạo một thư viện xử lý chú thích cho các chú thích của Room @Entity
và @Database
. Lấy @Entity
ví dụ về một lớp được chú thích . Đây là các bước bạn sẽ phải làm theo
- Tạo mới
StringBuilder
và thêm "TẠO BẢNG NẾU KHÔNG TỒN TẠI"
- Lấy tên bảng từ
class.simplename
hoặc theo tableName
trường của @Entity
. Thêm nó vào của bạnStringBuilder
- Sau đó, đối với mỗi trường của lớp bạn tạo các cột SQL. Lấy tên, kiểu, khả năng vô hiệu của trường hoặc bằng chính trường hoặc bằng
@ColumnInfo
chú thích. Đối với mọi trường, bạn phải thêm id INTEGER NOT NULL
kiểu cột vàoStringBuilder
.
- Thêm khóa chính bằng
@PrimaryKey
- Thêm
ForeignKey
và Indices
nếu tồn tại.
- Sau khi hoàn tất chuyển đổi nó thành chuỗi và lưu nó trong một số lớp mới mà bạn muốn sử dụng. Ví dụ, lưu nó như dưới đây
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
Sau đó, bạn có thể sử dụng nó như
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
Tôi đã tạo một thư viện như vậy cho chính mình mà bạn có thể kiểm tra, và thậm chí sử dụng nó trong dự án của bạn. Lưu ý rằng thư viện mà tôi đã tạo chưa đầy và nó chỉ đáp ứng các yêu cầu của tôi để tạo bảng.
RoomExtension để di chuyển tốt hơn
Ứng dụng sử dụng RoomExtension
Hy vọng nó hữu ích.
CẬP NHẬT
Vào thời điểm viết câu trả lời này, phiên bản phòng là 2.1.0-alpha03
và khi tôi gửi email cho các nhà phát triển, tôi đã nhận được phản hồi
Dự kiến sẽ có Hệ thống di chuyển tốt hơn trong 2.2.0
Thật không may, chúng tôi vẫn thiếu Hệ thống di chuyển tốt hơn.