Room Persistence Libraryで遊んでいると、データクラスフィールドにNOT NULL制約とUNIQUE制約を設定する方法がないことがわかりました。 SQLiteがこれらの制約をサポートするかどうか。これらの制約が使用されている古いデータベースを移行することは問題ではありませんか?誰でもこの問題について提案をすることはできますか?
NOT NULLおよびUNIQUE制約を使用してデータクラスフィールドを設定する方法がないことを知りました
_@NonNull
_フィールドに_@Entity
_注釈を付けると、そのフィールドの列に_NOT NULL
_が適用されます。
_unique=true
_上の_@Index
_は、一意性制約を強制します(例:@Entity(indices={@Index(value="something", unique=true)}
)。ただし、列を介したプレーンUNIQUE
制約は、インデックスを介した場合を除き、サポートされていないことは正しいです。
これらの制約が使用されている古いデータベースを移行することは問題ではありませんか?
Roomは、特に現在のalpha
状態では、既存のデータベース構造をサポートするようには設計されていません。時間が経つにつれて、Roomがより高い割合のSQLite機能をサポートすることを期待していますが、100%に達するとif然とします。
Kotlinを使用している場合の_NOT NULL
_に関する補完的な回答:
タイプを非オプションとしてマークすると、自動的にnullにならないことに注意してください(オプションのタイプはそれを行いません)。
データベースで@Database(exportSchema = true)
を使用して、roomによって生成されたスキーマで確認できます。
たとえば、次のようなものがあります。
_@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は他の場所で使用するコンバーターのための文字列です)
ヌル可能フィールドの場合、ラッパープリミティブ型Javaを使用できます。たとえば、RoomテーブルでIntegerインスタンスintを使用します。 ラッパープリミティブ型Java のように、これはnullになりますが、プリミティブ型クラスはnullになりません。 notNull = trueを使用するプリミティブフィールドのこのSQLコードの生成では、ジェネレーションSQLコードでIntegerを使用する場合はnotNull = falseを使用します
データベースに挿入したいものに基づいて一意のマークが付けられる複数のアイテムがある場合は、複合主キーを使用できます。
NOT NULLの場合、Roomは「@NonNull」アノテーションを提供します。これは、NULLにできないフィールドに追加されます。
下記の例では。ロール番号は各クラスで一意ですが、2つの異なるクラスが同じロール番号を持つことができます。したがって、クラスとrollNumberを複合主キーとして使用し、dbに一意に挿入できます。例:
@Entity(primaryKeys = {"rollNumber", "class"})
class Student {
@NonNull
private int rollNumber;
private String firstName;
private String lastName;
private int class;
}