Java 聊天应用程序:在解析查询中获取两个用户之间的消息
我正在使用Parse构建一个聊天应用程序。我想检索两个用户之间的聊天历史记录。在SQL中,可以这样表示:Java 聊天应用程序:在解析查询中获取两个用户之间的消息,java,android,parse-platform,Java,Android,Parse Platform,我正在使用Parse构建一个聊天应用程序。我想检索两个用户之间的聊天历史记录。在SQL中,可以这样表示: SELECT * FROM Message WHERE (sender = user1 AND receiver = user2) OR (sender = user2 AND receiver = user1) 但我不知道如何转换为解析查询 这里是我的消息模型: import java.util.Date; import com.parse.ParseClassName; import
SELECT * FROM Message WHERE (sender = user1 AND receiver = user2) OR (sender = user2 AND receiver = user1)
但我不知道如何转换为解析查询
这里是我的消息模型:
import java.util.Date;
import com.parse.ParseClassName;
import com.parse.ParseObject;
import com.parse.ParseUser;
@ParseClassName("Message")
public class Message extends ParseObject {
public Message() {
}
public String getId() {
return getObjectId();
}
public Date getDate() {
return getCreatedAt();
}
public ParseUser getSender() {
return getParseUser("sender");
}
public void setSender(ParseUser user) {
put("sender", user);
}
public ParseUser getReceiver() {
return getParseUser("receiver");
}
public void setReceiver(ParseUser user) {
put("receiver", user);
}
public String getContent() {
return getString("content");
}
public void setContent(String content) {
put("content", content);
}
}
您可以使用类似的方法:
String user1;
String user2;
// build first AND condition
ParseQuery<ParseObject> queryPart1 = ParseQuery.getQuery("Message");
queryPart1.whereEqualTo("sender", user1);
queryPart1.whereEqualTo("receiver", user2);
// build second AND condition
ParseQuery<ParseObject> queryPart2 = ParseQuery.getQuery("Message");
queryPart2.whereEqualTo("sender", user2);
queryPart2.whereEqualTo("receiver", user1);
// list all queries condition for next step
List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
queries.add(queryPart1);
queries.add(queryPart2);
// Compose the OR clause
ParseQuery<ParseObject> innerQuery = ParseQuery.or(queries);
innerQuery.addAscendingOrder("createdAt"); // apply sorting for creation date ascending (use addDescendingOrder for Desc sorting)
// *** Parse does not allow selection result greater than 1000 elements for query, so you may need to paging your system
//innerQuery.setSkip(10); // skip the first 10 results
//innerQuery.setLimit(200); // limit selection to first 200 elements ( from your skip offset if set, from the first otherwise )
// Run selection asynchronously
innerQuery.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> results, ParseException e) {
// Do your stuff with 'results' list, if no error has been occurred
// ...
// ..
// .
}
});
stringuser1;
字符串user2;
//先建后修
ParseQuery queryPart1=ParseQuery.getQuery(“消息”);
queryPart1.whereEqualTo(“发件人”,用户1);
查询第1部分。whereEqualTo(“接收方”,用户2);
//建立第二个条件
ParseQuery queryPart2=ParseQuery.getQuery(“消息”);
queryPart2.whereEqualTo(“发件人”,用户2);
查询第2部分。whereEqualTo(“接收方”,用户1);
//列出下一步的所有查询条件
列表查询=新建ArrayList();
querys.add(queryPart1);
querys.add(queryPart2);
//组成OR子句
ParseQuery innerQuery=ParseQuery.or(查询);
innerQuery.addAscendingOrder(“createdAt”);//为创建日期升序应用排序(使用addDescendingOrder进行描述排序)
//***Parse不允许查询的选择结果大于1000个元素,因此您可能需要对系统进行分页
//innerQuery.setSkip(10);//跳过前10个结果
//innerQuery.setLimit(200);//将选择限制为前200个元素(如果设置了跳过偏移,则从第一个元素开始,否则从第一个元素开始)
//异步运行选择
findInBackground(新的FindCallback(){
公共作废完成(列出结果,异常解析){
//如果没有发生错误,请使用“结果”列表完成工作
// ...
// ..
// .
}
});
希望有帮助 你真的应该关注聊天信息的存储方式,而不是如何查询它们。在我看来,您的模型非常SQL化,这会导致在以后需要显示历史时出现相当复杂且缓慢的查询和计算 您应该以更NoSQL的方式设计模型,以从Parse的NoSQL后端(MongoDB)中获得好处 设计模型时,首先定义要对其执行的查询。您可以通过查询和排序来解决您的聊天历史记录,但性能方面更好的方法是确保您的聊天历史记录已经存在于服务器上。这将使对历史记录的查询变得超快速,并且用户设备上的负载最小 这里建议的一种解决办法是: