blob: fc69adae0c3fa1e930948626f3a0b2fafb7193f4 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.room;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Marks a class as an entity. This class will have a mapping SQLite table in the database.
* <p>
* Each entity must have at least 1 field annotated with {@link PrimaryKey}.
* You can also use {@link #primaryKeys()} attribute to define the primary key.
* <p>
* Each entity must either have a no-arg constructor or a constructor whose parameters match
* fields (based on type and name). Constructor does not have to receive all fields as parameters
* but if a field is not passed into the constructor, it should either be public or have a public
* setter. If a matching constructor is available, Room will always use it. If you don't want it
* to use a constructor, you can annotate it with {@link Ignore}.
* <p>
* When a class is marked as an Entity, all of its fields are persisted. If you would like to
* exclude some of its fields, you can mark them with {@link Ignore}.
* <p>
* If a field is {@code transient}, it is automatically ignored <b>unless</b> it is annotated with
* {@link ColumnInfo}, {@link Embedded} or {@link Relation}.
* <p>
* Example:
* <pre>
* {@literal @}Entity
* public class User {
* {@literal @}PrimaryKey
* private final int uid;
* private String name;
* {@literal @}ColumnInfo(name = "last_name")
* private String lastName;
*
* public User(int uid) {
* this.uid = uid;
* }
* public String getLastName() {
* return lastName;
* }
* public void setLastName(String lastName) {
* this.lastName = lastName;
* }
* }
* </pre>
*
* @see Dao
* @see Database
* @see PrimaryKey
* @see ColumnInfo
* @see Index
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Entity {
/**
* The table name in the SQLite database. If not set, defaults to the class name.
*
* @return The SQLite tableName of the Entity.
*/
String tableName() default "";
/**
* List of indices on the table.
*
* @return The list of indices on the table.
*/
Index[] indices() default {};
/**
* If set to {@code true}, any Index defined in parent classes of this class will be carried
* over to the current {@code Entity}. Note that if you set this to {@code true}, even if the
* {@code Entity} has a parent which sets this value to {@code false}, the {@code Entity} will
* still inherit indices from it and its parents.
* <p>
* When the {@code Entity} inherits an index from the parent, it is <b>always</b> renamed with
* the default naming schema since SQLite <b>does not</b> allow using the same index name in
* multiple tables. See {@link Index} for the details of the default name.
* <p>
* By default, indices defined in parent classes are dropped to avoid unexpected indices.
* When this happens, you will receive a {@link RoomWarnings#INDEX_FROM_PARENT_FIELD_IS_DROPPED}
* or {@link RoomWarnings#INDEX_FROM_PARENT_IS_DROPPED} warning during compilation.
*
* @return True if indices from parent classes should be automatically inherited by this Entity,
* false otherwise. Defaults to false.
*/
boolean inheritSuperIndices() default false;
/**
* The list of Primary Key column names.
* <p>
* If you would like to define an auto generated primary key, you can use {@link PrimaryKey}
* annotation on the field with {@link PrimaryKey#autoGenerate()} set to {@code true}.
*
* @return The primary key of this Entity. Can be empty if the class has a field annotated
* with {@link PrimaryKey}.
*/
String[] primaryKeys() default {};
/**
* List of {@link ForeignKey} constraints on this entity.
*
* @return The list of {@link ForeignKey} constraints on this entity.
*/
ForeignKey[] foreignKeys() default {};
}