从 LiveData 获取一个值

Tom*_*m11 6 android android-room android-livedata android-viewmodel

我有LiveDataBooks inViewModel的构造函数:

LiveData<List<Book>> books;

public MyViewModel(@NonNull Application application) {
    super(application);
    books = bookRepository.getBooks();
}
Run Code Online (Sandbox Code Playgroud)

当用户book从 UI创建新书时,我希望属性book_order填充最多增加book_order的其他书籍。为了更好地描述我想要什么,请参阅以下 preudocode:

book.book_order = max(books.book_order) + 1;
Run Code Online (Sandbox Code Playgroud)

因此,当有三本书book_order分别为 1、2、3 时,新书会将这个属性设置为 4。

问题是,我怎么能用LiveDatain做到这一点ViewModel?我尝试使用Transformations.map新的LiveData,但这种方法根本不起作用,bookMax似乎是null.

public void insertBook(Book book) {
    LiveData<Integer> bookMax = Transformations.map(books,  
        list -> {
          int value = 0;
          for(Book b: list) {
              if (value < b.getBookOrder()) {
                 value = b.getBookOrder();
              }
          }
        }
    );
    book.setBookOrder(bookMax + 1)
    bookRepository.update(book);
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何为新书设置增量最大值?它可以是不同于此处描述的方法的另一种方法。ViewModel创建是为了将应用程序逻辑与 UI 分开。然而,在这种情况下似乎并没有这样做,因为如果我想观察价值,我需要在Activity. 另外,我没有找到任何替代方法来执行这种从 DB 获取一个值的操作。任何帮助表示赞赏。

dha*_*sky 3

请注意,您的booksare livedata,因此可能会不时更改其值。
其中 yourbookMax是应在插入时计算的 单个值。

要插入您需要:

  • 获取当前图书列表
  • 然后计算bookMax
  • 然后实际插入。
val bookList: List<Book> = books.value   // current value. may be null!

val bookMax: Int = bookList.maxBy { it.order }.order   // find max order

// insert
val newBooks = arrayListOf(bookList)
newBooks.add(newBook)

books.value = newBooks  // update your livedata
Run Code Online (Sandbox Code Playgroud)

编辑这是Java代码

// get current value. may be null!
List<Book> bookList = books.getValue();
// so we better handle it early
if (bookList == null) {
    bookList = new ArrayList<>();
}

// calculate max order
int maxOrder = -1;
for (Book book : bookList) {
    if (maxOrder < book.order) {
        maxOrder = book.order;
    }
}

// create new book
Book newBook = new Book();
newBook.order = maxOrder + 1;

// add book to the list
bookList.add(newBook);

// do with new list whatever you want
// for example, you can update live data (if it is a MutableLiveData)
books.setValue(bookList);
Run Code Online (Sandbox Code Playgroud)