web-dev-qa-db-ja.com

Room Persistence Libraryに「NOT NULL」および「UNIQUE」制約はありません

Room Persistence Libraryで遊んでいると、データクラスフィールドにNOT NULL制約とUNIQUE制約を設定する方法がないことがわかりました。 SQLiteがこれらの制約をサポートするかどうか。これらの制約が使用されている古いデータベースを移行することは問題ではありませんか?誰でもこの問題について提案をすることはできますか?

11

NOT NULLおよびUNIQUE制約を使用してデータクラスフィールドを設定する方法がないことを知りました

_@NonNull_フィールドに_@Entity_注釈を付けると、そのフィールドの列に_NOT NULL_が適用されます。

_unique=true_上の_@Index_は、一意性制約を強制します(例:@Entity(indices={@Index(value="something", unique=true)})。ただし、列を介したプレーンUNIQUE制約は、インデックスを介した場合を除き、サポートされていないことは正しいです。

これらの制約が使用されている古いデータベースを移行することは問題ではありませんか?

Roomは、特に現在のalpha状態では、既存のデータベース構造をサポートするようには設計されていません。時間が経つにつれて、Roomがより高い割合のSQLite機能をサポートすることを期待していますが、100%に達するとif然とします。

38
CommonsWare

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は他の場所で使用するコンバーターのための文字列です)

4

ヌル可能フィールドの場合、ラッパープリミティブ型Javaを使用できます。たとえば、RoomテーブルでIntegerインスタンスintを使用します。 ラッパープリミティブ型Java のように、これはnullになりますが、プリミティブ型クラスはnullになりません。 notNull = trueを使用するプリミティブフィールドのこのSQLコードの生成では、ジェネレーションSQLコードでIntegerを使用する場合はnotNull = falseを使用します

1
Mahdi Azadbar

データベースに挿入したいものに基づいて一意のマークが付けられる複数のアイテムがある場合は、複合主キーを使用できます。

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;
        } 
0
Ashish John