2017-09-04 45 views
1

當使用房間持久性庫時,我開始知道沒有方法來設置具有NOT NULL和UNIQUE約束的數據類字段。 SQLite是否支持這些約束。在使用這些約束的情況下遷移舊數據庫不是一個問題嗎?任何人都可以對這個問題提出建議嗎?房間持久性庫沒有「NOT NULL」和「UNIQUE」限制

+0

支持唯一約束,請檢查索引和唯一性,https://developer.android.com/topic/libraries/architecture/room.html – USKMobility

回答

12

我才知道,有沒有方法來設置數據類字段NOT NULL,也UNIQUE約束

一個@NonNull註釋上的@Entity字段將導致該字段的列有應用NOT NULL到它。

unique=true@Index將強制執行唯一性約束(例如,@Entity(indices={@Index(value="something", unique=true)})。但是,您是正確的,不支持通過索引之外的列上的普通UNIQUE約束。

使用這些約束條件遷移舊數據庫不是一個問題嗎?

房間的設計不支持現有的數據庫結構,特別是在當前的alpha狀態下。隨着時間的推移,我希望Room會支持更高比例的SQLite功能,但如果它達到100%,我會驚呆。

+0

非常感謝:) –

+0

非常感謝您對房間圖書館的瞭解。我有這麼多的問題,並且在我得到解決方案時,它總是您的答案:D – Aenadon

1

互補答案使用科特林那些即將NOT NULL

請注意,標誌着類型爲非可選自動使其不爲空(和一個可選的類型不會做)。

您可以在數據庫的@Database(exportSchema = true)房間生成的架構中對其進行檢查。

比如我有類似的東西:

@Entity(tableName = "messages") 
data class Message (
     @PrimaryKey 
     val messageId: UUID = UUID.randomUUID(), 
     val date: Date = Date(), 
     val receivedDate: Date? = null 
) 

而在生成的模式,我可以讀到:

"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`messageId` TEXT NOT NULL, `date` INTEGER NOT NULL, `receivedDate` INTEGER, PRIMARY KEY(`messageId`))" 

(注:日期類型是這裏的Int和UUID的字符串由於我在別處使用的轉換器)