web-dev-qa-db-ja.com

Android Room Persistence Libraryを使用してNOT NULLとして列に注釈を付ける方法

データクラスは次のようになります

@Entity(tableName = "items")
data class Item(
        @ColumnInfo(name = "name") var name: String = "",
        @ColumnInfo(name = "room") var room: String = "",
        @ColumnInfo(name = "quantity") var quantity: String = "",
        @ColumnInfo(name = "description") var description: String = "",
        @PrimaryKey(autoGenerate = true)
        @ColumnInfo(name = "id") var id: Long = 0
)

ルームはSQLiteを使用し、SQLiteはデータベース内のNOT NULL列をサポートします。 @NonNullを使用して列に注釈を付けましたが、効果はありません。

ルームデータベースの列をNULL不可にする方法はありますか?

16
Tuby

NOT NULLの正確な注釈を識別するために、このリンクで提供されているすべての注釈のリストを調べました: Android.Arch.persistence.room しかし、関連する注釈が見つかりませんでした:

enter image description here

私の想定では、デフォルトでvarをオプションではないものとして扱うKotlinを使用しているため、宣言されたすべての属性はNOT NULLです。 varをオプションとして宣言するには、おそらく?を使用する必要があります。演算子、以下の例:

var name: String // NOT NULL 
var name: String? // OPTIONAL

コメントに基づいて更新:

NULLと空の文字列と混同していると思います。 NULLは値がないことを意味します。共有コードでは、空の文字列でありNULLに等しくない各列にデフォルト値を提供しているため、その属性に値を提供していなくても、デフォルトで空の文字列。

属性の値割り当て演算子とRHS値を削除してから、その属性に値を割り当てずにレコードを挿入してください。適切なエラーが発生します。

基本的に、以下のステートメントを変換します。

@ColumnInfo(name = "name") var name: String = ""

@ColumnInfo(name = "name") var name: String
15
Devarshi

Javaの場合、@ Android.support.annotation.NonNullで注釈を付ける必要があります

@ io.reactivex.annotations.NonNullと混同しないでください

36
Nokuap

Javaを使用しました@NonNull 後に @ColumnInfo

@ColumnInfo(name = "column_name")
@NonNull private String str;

クラスに正しいライブラリがインポートされていることを確認してください。

import Android.support.annotation.NonNull;
8
avisper

Kotlinを使用している場合の補完的な回答:

タイプを非オプションとしてマークすると、自動的に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は他の場所で使用するコンバーターのための文字列です)

7

実際のテーブル制約に対する回避策として、単一のメソッドTypeConverterクラスを使用して、Stringメンバーがnullでないことを確認できます。

たとえば、Null以外の文字列の場合、次を使用できます。

public class RoomConverterNullString {
    @TypeConverter
    public static String fromNullToString(String value) {
        if (value == null) {
            return "";
        } else {
            return value;
        }
    }
}

もちろん、このように単純化できます:

public class RoomConverterNullString {
    @TypeConverter
    public static String fromNullToString(String value) {
        return (value == null) ? "" : value;
    }
}

そして、次のように使用できます。

@TypeConverters(RoomConverterNullString.class)
public String stringMember;

値がnullの場合、割り当てと更新/挿入アクションは空の文字列値を格納し、取得すると空の文字列に強制的にnull値が変換されます。

これは、他のタイプおよび必要なデフォルト値に対して実行できます。

2
Evan I