我的后端建立在Firestore上,没有逻辑OR
来构建我的查询,因此要解决此问题,我正在使用多个查询并将其合并以模拟逻辑OR
,查询请求和合并可以正常工作,但是现在又遇到了另一个问题,我得到重复数据,因此,为了解决这个问题,我决定创建一个HashSet
并将对象存储在其中,但仍然在哈希集中获得重复数据
这是我合并查询的方式:
Tasks.whenAllSuccess(c).addOnSuccessListener(new BaseValueOnSuccessListener(mapper, firebaseCallback));
c是Task的集合
这是我(在自定义BaseValueOnSuccessListener侦听器中)存储数据的方式:请检查我的OnSuccess方法
public class BaseValueOnSuccessListener<Model, Entity> implements OnSuccessListener<List<QuerySnapshot>> {
private FirebaseMapper<Entity, Model> mapper;
// FirebaseDatabaseRepositoryCallback is an interface
private FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<Model> callback;
public BaseValueOnSuccessListener(FirebaseMapper<Entity, Model> mapper,
FirebaseDatabaseRepository.FirebaseDatabaseRepositoryCallback<Model> callback) {
this.mapper = mapper;
this.callback = callback;
}
@Override
public void onSuccess(List<QuerySnapshot> querySnapshots) {
// Do what you need to do with your list
if (!querySnapshots.isEmpty()) {
// List<Model> data = new ArrayList<>();
Set<Model> data = new HashSet<>();
for (QuerySnapshot querySnapshot : querySnapshots) {
data.addAll(mapper.mapList(querySnapshot));
}
callback.onSuccess(new ArrayList<Model>(data));
}
}
}
答案 0 :(得分:1)
现在还有另一个问题,我得到重复的数据,因此,为了解决这个问题,我决定创建一个哈希集并将对象存储在其中,但是我仍然在哈希集中得到重复的数据
由于在Set
中添加了Model
类型的不同对象,因此您获得重复数据。集合中的每个Model
对象在内存中都有一个不同的地址,这就是集合中每个对象都不同的原因。 Set
是扩展Collection的接口,因此,使用这样的Collection时,除非您指定它,否则您不知道对象中的字段是否与另一个对象中的另一个文件具有相同的值。
Set
和List
之间有很大的区别。如果您使用的是:
List<String> list = new ArrayList<>();
list.add("user2426691");
list.add("user2426691");
list.add("user2426691");
Log.d(TAG, list.toString());
您将看到您的列表将包含三个重复的名称。但是,如果您像下面的代码行那样使用Set
字符串,则:
Set<String> set = new HashSet<>(list);
Log.d(TAG, set.toString());
您会注意到,您的Set
仅包含一个元素(没有重复元素)。
要解决您的问题,可以使用List
或Set
,但是您需要根据以下条件填充所需的对象集合:
if(!model.getName().equals("someName")) {
list.add(model);
}