【发布时间】:2018-08-05 08:49:10
【问题描述】:
我正在尝试从Cloud Firestore 数据库中检索一组复杂对象。这是我的课:
public class Book {
private String id;
private String name;
private String original;
private ArrayList<Author> authors;
private ArrayList<Translator> translators;
private Series series;
private Float no;
private String seriesNo;
private Integer published;
private Borrower borrower;
private Boolean isCollection;
private Status status;
}
将此Book 对象保存到数据库的最佳方法是什么?我目前正在使用以下方法。
public void createBook(String userId) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
DocumentReference documentReference = firebaseFirestore.collection("books").document();
Map<String, Object> newBook = new HashMap<>();
newBook.put("owner", userId);
newBook.put("id", documentReference.getId());
newBook.put("name", getName());
newBook.put("original", getOriginal());
if (getSeries() != null) {
Map<String, Object> series = new HashMap<>();
series.put("id", getSeries().getId());
series.put("name", getSeries().getName());
newBook.put("series", series);
}
newBook.put("no", getNo());
newBook.put("seriesNo", getSeriesNo());
newBook.put("published", getPublished());
if (getBorrower() != null) {
Map<String, Object> borrower = new HashMap<>();
borrower.put("id", getBorrower().getId());
borrower.put("nameInEnglish", getBorrower().getNameInEnglish());
borrower.put("nameInSinhalese", getBorrower().getNameInSinhalese());
borrower.put("mobile", getBorrower().getMobile());
newBook.put("borrower", borrower);
}
newBook.put("isCollection", getIsCollection());
newBook.put("status", getStatus().toString());
documentReference
.set(newBook)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
for (int i = 0; i < getAuthors().size(); i++) {
documentReference.collection("authors").document("author" + i)
.set(getAuthors()
.get(i));
}
for (int i = 0; i < getTranslators().size(); i++) {
documentReference.collection("translators").document("translator" + i)
.set(getTranslators()
.get(i));
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
从数据库中检索保存的值的最佳方法是什么?很难找到一次访问所有值的好方法。我目前使用以下方法来检索除 Authors 和 Translators 之外的值(它们是 ArrayLists)。
public void getBooks(final BookRetrievable bookRetrievable, String userId) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
ArrayList<Book> books = new ArrayList<>();
firebaseFirestore.collection("books")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot documentSnapshot : task.getResult()) {
Book book = new Book();
book.setId(documentSnapshot.getString("id"));
book.setName(documentSnapshot.getString("name"));
book.setOriginal(documentSnapshot.getString("original"));
Series series = new Series();
series.setId(documentSnapshot.getString("series.id"));
series.setName(documentSnapshot.getString("series.name"));
book.setSeries(series);
book.setNo(documentSnapshot.getDouble("no").floatValue());
book.setSeriesNo(documentSnapshot.getString("seriesNo"));
book.setPublished(documentSnapshot.getLong("published").intValue());
Borrower borrower = new Borrower();
borrower.setId(documentSnapshot.getString("series.id"));
borrower.setNameInEnglish(documentSnapshot.getString("series.nameInEnglish"));
borrower.setNameInSinhalese(documentSnapshot.getString("series.nameInSinhalese"));
borrower.setFacebook(documentSnapshot.getString("series.facebook"));
borrower.setMobile(documentSnapshot.getString("series.mobile"));
book.setBorrower(borrower);
book.setIsCollection(documentSnapshot.getBoolean("isCollection"));
book.setStatus(Status.valueOf(documentSnapshot.getString("status")));
books.add(book);
}
books.sort((Book b1, Book b2) -> b1.getName().compareTo(b2.getName()));
bookRetrievable.onCallback(books);
} else {
}
}
});
}
还有什么比这更好的方法吗?请告诉我一次性检索 ArrayList 的最佳方法是什么?
为了便于理解,我添加了已经保存在数据库中的示例截图:
提前致谢!
【问题讨论】:
标签: java android firebase google-cloud-firestore