这是我在Firebase上上传的模型:
public class OnlineMatch{
private User user1;
private User user2;
public OnlineMatch(User firstPlayer, User secondPlayer) {
this.user1 = firstPlayer;
this.user2 = secondPlayer;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我以这种方式将数据发送到Firebase(kotlin):
fun createMatch(match: OnlineMatch) {
val matchList = database.child("multiplayer").push()
matchList.setValue(match)
}
Run Code Online (Sandbox Code Playgroud)
因此,我的数据库结构如下:
如果扩展节点,则可以完美地看到我的对象:OnlineMatch(User1,User2)
现在,我想查询数据库并获取ArrayList'<'OnlineMatch'>'。 我已经找到了Firebase文档,但没有发现任何有用的信息。我能怎么做?提前致谢。
我有一个这样的课:
class dataModel {
String id, name;
Integer count;
dataModel() {}
}
Run Code Online (Sandbox Code Playgroud)
我从Firebase添加数据.
mDatabase.addValueEventListener(mListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
dataSet.add(dataSnapshot.getValue(dataModel.class));
//...
}
});
Run Code Online (Sandbox Code Playgroud)
当我将应用程序作为调试运行时,没有问题.但在它发布后,应用程序崩溃并出现错误:
com.google.firebase.database.DatabaseException: No properties to serialize found on class com.my.package.dataModel
Run Code Online (Sandbox Code Playgroud)
我有minifyEnabled 是的
我在Cloud Firestore的单个集合中有1000个文档,是否可以提取随机文档?
举例来说:Students是Firestore中的一个集合,我有1000个学生,我的要求是每次通话随机选择10个学生。
我正在尝试使用Cloud Firestore的Firebase-UI库创建聊天。 这个 github仓库包含我正在使用的相关代码。问题与查询的顺序有关。
看到查询指定为:
Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);
Run Code Online (Sandbox Code Playgroud)
但是,我以正确的顺序(从旧到新)获得了最旧的50条消息,而不是最新的消息。另一方面,我可以使用以下查询:
Query sChatQuery = sChatCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);
Run Code Online (Sandbox Code Playgroud)
这会检索50条最新消息,但顺序错误(最新消息排在最前面,最旧消息排在最下面)。因此,我不知道该怎么做。
我可以在本地再次反转查询的结果,但是我无法弄清楚该怎么做(我已经走过了FirebaseUI库,但运气不佳)。
编辑
chat对于events集合中的每个事件,我都有其子集合:
events/event_doc/chat/chat_doc
我想得到如下消息:
Message 1
Message 2
Message 3
Message 4
...
Run Code Online (Sandbox Code Playgroud)
使用默认顺序,我会收到如上所示的消息,但是limit说明将快照从1减少到50,并且Message 51(最新的)快照未被检索。
我的Firestore数据库结构:
|
|=>root_collection
|
|=>doc1
|
|=>collection
|
|=>doc2
|
|=>collection
|
|=>doc3
|
|=>collection
Run Code Online (Sandbox Code Playgroud)
现在我想从中获取文件清单root_collection。将有一个包含以下数据的列表{"doc1", "doc2", "doc3"}。我需要它是因为我想制作一个微调器并将这些数据放入微调器中。然后,用户将选择一些文档并下载。
我尝试使用下面的代码:
firestore.collection("root_collection")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG,document.getId() + " => " + document.getData());
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Run Code Online (Sandbox Code Playgroud)
但是代码只有在我拥有文档中没有集合的数据结构时才起作用。在其他情况下,中没有任何文档QueryDocumentSnapshot。
谢谢!
我正在对一个小应用程序进行一些测试,以了解 firebase-analytics 的工作原理。这是 MainActivity 的代码:
public class MainActivity extends AppCompatActivity {
private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFirebaseAnalytics = FirebaseAnalytics.getInstance(getApplicationContext());
mFirebaseAnalytics.setAnalyticsCollectionEnabled(true);
mFirebaseAnalytics.setMinimumSessionDuration(10000);
mFirebaseAnalytics.setSessionTimeoutDuration(300);
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_ID,"ID");
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME,"NAME");
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE,"image");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
}
Run Code Online (Sandbox Code Playgroud)
要查看我的应用程序是否将数据发送到 Firebase,我尝试使用 DebugView 但它说没有任何设备可用,我还使用了命令
adb shell setprop debug.firebase.analytics.app <package_name>
Run Code Online (Sandbox Code Playgroud)
但什么都没有改变。
如果我使用这 3 个命令
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
Run Code Online (Sandbox Code Playgroud)
我可以看到我的应用程序正在向 firebase 发送一些数据,如图所示
我该怎么做才能启用 DebugView 并实时查看我的应用发送到 Firebase 的内容?
我列出了从我的Cloud Firestore数据库获取值的POJO对象列表。这个列表本身就是一个类,每当我创建一个新的列表时都会记住要检索属性。事实是,列表不是在创建活动中填写的,而是之后的时间。我尝试添加循环,任务,等待,但未获得所需的结果。这是我令人满意地检索数据的方式:
private void retrieveData(){
reference = firestore.collection("attractions");
reference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots,
@Nullable FirebaseFirestoreException e) {
attractionList.clear();
for (DocumentSnapshot snapshot : queryDocumentSnapshots) {
Attraction attraction = snapshot.toObject(Attraction.class);
addAttractions(attraction);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
每次创建新对象时,我都会检索数据:
public AttractionList() {
firestore.setFirestoreSettings(settings);
reference = firestore.collection("attractions");
attractionList = new ArrayList<>();
retrieveData();
}
Run Code Online (Sandbox Code Playgroud)
然后,如果我在创建时在我的活动中检查列表大小:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_attraction);
Toolbar toolbar = findViewById(R.id.tb_attraction);
setSupportActionBar(toolbar);
//Creating POJO List and retrieving data
attractionList = new AttractionList();
Log.e("List Size: ", ""+attractionList.getAttractionList().size());
//List …Run Code Online (Sandbox Code Playgroud) 我到处搜寻都没有运气。我想查询Firestore以获取类型为admin的所有用户。就像是:
SELECT * FROM users WHERE type=admin
Run Code Online (Sandbox Code Playgroud)
但仅在属性total更改时。如果我正在使用:
users.whereEqualTo("type", "admin").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) {
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
//Not trigger
break;
case MODIFIED:
//Trigger
break;
case REMOVED:
//
break;
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
当我查询时第一次触发ADDED的情况,而当total更改case MODIFIED时又被触发(这是需要的)。我只需要更改,而不想要所有初始数据,我不需要它。如何获得?
请帮助我,这是我项目的最后一部分。如何跳过case ADDED呢?
这是当前的示例结构
Posts(Collection)
- post1Id : {
viewCount : 100,
likes : 45,
points : 190,
title : "Title",
postType : image/video
url : FileUrl,
createdOn : Timestamp,
createdBy : user20Id,
userName : name,
profilePic: url
}
Users(Collection)
- user1Id(Document):{
postsCount : 10,
userName : name,
profilePic : url
}
viewed(Collection)
- post1Id(Document):{
viewedTime : ""
}
- user2Id(Document)
Run Code Online (Sandbox Code Playgroud)
最终目标是
可能的最佳解决方案是什么(例如改变结构、云功能、客户端多次查询)?
我想知道 Cloud Firestore 是否在元数据中为每个文档创建时间戳,如果是,该元数据是否可用?
我知道我可以出于任意原因在文档中创建自己的时间戳,但我只对文档本身的创建时间感兴趣。
提前致谢