Библиотека постоянства Android Room

Я новичок в Room, и @Relation для меня непонятен. Если я правильно понимаю, у меня есть сущности, например. (RSS)ChannelEntity, а в канале есть элементы с именами ItemEntity. Это классы с аннотацией @Entity. У меня также есть POJO для «подключения» моих объектов. Я имею в виду, что я должен написать POJO следующим образом:

public class Channel { 

   @Embedded
   private ChannelEntity channel;

// Link is the primary key in ChannelyEntity
   @Relation (parentColumn = "link", entityColumn = "channel_link")
   private ArrayList<ItemEntity> items;

// Getters and Setters are here
}

Затем я должен написать интерфейс dao, где я могу получить канал (не ChannelEntity) следующим образом:

public interface ChannelDao {

    @Query("SELECT * FROM channels WHERE link = :link LIMIT 1")
    Channel getChannelById(String link);

    @Query("SELECT * FROM channels")
    ArrayList<Channel> getAllChannels();
}

С помощью этих сущностей, DAO и POJO я могу получить объекты канала, которые содержат список элементов с соответствующей ссылкой (идентификатором). Это правильно?

Мой другой вопрос об остальном CRUD. Например. если я хочу сохранить новый канал, могу ли я добавить это утверждение в свой ChannelDao?

@Insert(onConflict = OnConflictStrategy.REPLACE)
void createChannels(Channel... channels);

удалить

@Delete
void deleteChannels(Channel... channels);

и так далее. Так будет ли он создавать и удалять ChannelEntities и ItemEntities из переданного объекта Channel?


person user3057944    schedule 18.07.2017    source источник
comment
Вы спрашиваете или пробовали, и это не работает? Room Persistence Library является новой (и альфа-версией), поэтому не так много опытных пользователей Android успели поиграться с ней (учитывая, что она вряд ли будет использоваться в производстве пока), так что лучше придумать с конкретными ошибками, образцами вообще; похоже, вы просто пытаетесь получить подтверждение, но ни у кого не будет времени проверить это. Так что вперед, пробуйте, а потом сообщайте об ошибках, когда они случаются. И опубликуйте все ваши соответствующие классы, а не только 1/2 из них.   -  person Martin Marconcini    schedule 18.07.2017
comment
Могу ли я добавить это утверждение в свой ChannelDao? -- Афаик, нет. Насколько я могу судить, идея @Relation состоит в том, чтобы использовать его для заполнения модели представления.   -  person CommonsWare    schedule 18.07.2017
comment
Я еще не использовал его, сначала я хотел бы узнать, как я могу сохранить и прочитать его из базы данных с объектами Room, которые содержат список или другие объекты. Если я использую @ForeignKey, я могу вернуть объект со списком в одном запросе.   -  person user3057944    schedule 18.07.2017
comment
@CommonsWare, так что вы говорите, что я должен писать дао для этих сущностей, и я могу использовать аннотацию Relation, чтобы получить объект Channel?   -  person user3057944    schedule 18.07.2017
comment
Я говорю, что AFAIK @Relation является конструкцией только для чтения. Когда вы хотите что-то сохранить, AFAIK, вы используете сущности (или пользовательский SQL в @Query), а не POJO с @Relation.   -  person CommonsWare    schedule 18.07.2017
comment
Пожалуйста, обратитесь к этому ответу SO. stackoverflow.com/a/44424148   -  person E-Rock    schedule 19.07.2017


Ответы (1)


Я обновил свои классы, как посоветовал @CommonsWare. Теперь у меня есть классы сущностей с объектом @Embedded:

    @Entity (tableName = "channels")
public class ChannelEntity {
    // Required channel elements
    // The name of the channel. It's how people refer to your service.
    private String title;
    // The URL of the HTML website corresponding to the channel
    @PrimaryKey
    private String link;
    //other fileds
    @Embedded
    private TextInputEntity textInputEntity;
    @Embedded
    private ImageEntity imageEntity;
    //getters and setters
}

Один из встроенных классов:

// Specifies a text input box displayed with the channel.
// Embedded in ChannelEntity
public class TextInputEntity {
    // Required elements
    // The label of the Submit button in the text input area.
    private String title;
    // Explains the text input aera.
    private String description;
    // The name of the text object int hte text input area.
    private String name;
    // The URL of the CGI script that processes the text input request
    private String link;
    @ColumnInfo (name = "channel_link")
    private String channelLink;
}

Я написал daos для всех классов с аннотацией @Entity (я назвал встроенные классы сущностью, даже если они не являются таковыми, но у меня были бы модельные классы для представлений, и я не хочу их смешивать позже).

Я сопоставил отношения следующим образом:

// All items are optional, but at least one of title or description must be presented.
@Entity (tableName = "items"
        , foreignKeys = @ForeignKey (entity = Channel.class
        , parentColumns = "link"
        , childColumns = "channel_link"))
public class ItemEntity {
    @PrimaryKey (autoGenerate = true)
    private int id;
    // Title of the item
    private String title;
    // Other fileds
    @ColumnInfo (name = "channel_link")
    private String channelLink;
    // Getters and setters

И когда я хочу получить канал со списком элементов, я получаю это так:

public class Channel {
    @Embedded
    private ChannelEntity channel;
    @Relation (parentColumn = "link", entityColumn = "channel_link")
    private ArrayList<ItemEntity> items;
    @Relation (parentColumn = "link", entityColumn = "channel_link")
    private ArrayList<SkipDayEntity> skipDays;
    @Relation (parentColumn = "link", entityColumn = "channel_link")
    private ArrayList<SkipHourEntity> skipHours;
//Setters and getters
}

А это дао для канала:

@Dao
public interface ChannelDao {
    @Insert (onConflict = OnConflictStrategy.REPLACE)
    void insertChannel(ChannelEntity channel);

    @Update
    void updateChannel(ChannelEntity channel);

    @Delete
    void deleteChannel(ChannelEntity channel);

    @Query ("SELECT * FROM channles WHERE link = :link LIMIT 1")
    Channel getChannelByLink(String link);

    @Query ("SELECT * FROM channels")
    LiveData<ArrayList<Channel>> getAllChannels();
}
person user3057944    schedule 19.07.2017