解析“未找到查询结果(代码 101)”。无法获取对象 ID

Posted

技术标签:

【中文标题】解析“未找到查询结果(代码 101)”。无法获取对象 ID【英文标题】:Parse "no results found for query (code 101)". Can't get object id 【发布时间】:2016-02-05 19:53:41 【问题描述】:

我已经在我的桌面上安装了示例解析服务器 (https://github.com/ParsePlatform/parse-server-example) 并制作了一个简单的应用程序来测试它。

我的应用程序将一个对象保存到服务器,获取该对象并将 mTextView 的值设置为我的对象的值。

问题是,当我尝试使用此代码从服务器获取数据时,它可以工作:

    query.getInBackground("5K7N8a8Dmd", new GetCallback<ParseObject>() ...

(通过 curl 获取对象 id)

但是当我尝试这个时(使用 curl 获取对象 id):

            gameScore.saveInBackground(new SaveCallback() 
            public void done(ParseException e) 
                if (e == null) 
                    objectId = gameScore.getObjectId();
                 else 
                    Log.e("saveInBackground", getErrorMessage(e));
                
            
        );

...

    query.getInBackground(objectId, new GetCallback<ParseObject>() ...

它不起作用。

日志猫:

E/getInBackground﹕ no results found for query - code: 101

MainActivity.java

    public class MainActivity extends Activity 

    public TextView mTextView;
    public String objectId;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_view);

        Parse.initialize(new Parse.Configuration.Builder(getApplicationContext())
                        .applicationId(Constants.APP_ID)
                        .server(Constants.SERVER_URL)
                        .build()
        );

        final ParseObject gameScore = new ParseObject("Foo1234");
        gameScore.put("score", 5000);
        gameScore.saveInBackground(new SaveCallback() 
            public void done(ParseException e) 
                if (e == null) 
                    objectId = gameScore.getObjectId();
                 else 
                    Log.e("saveInBackground", getErrorMessage(e));
                
            
        );

        ParseQuery<ParseObject> query = ParseQuery.getQuery("Foo1234");
        query.getInBackground(objectId, new GetCallback<ParseObject>() 
            public void done(ParseObject object, ParseException e) 
                if (e == null) 
                    mTextView.setText(Integer.toString(gameScore.getInt("score")));
                 else 
                    Log.e("getInBackground", getErrorMessage(e));
                
            
        );
    

    public String getErrorMessage(ParseException e) 
        return e.getMessage() + " - code: " + e.getCode();
    


常量.java

    public class Constants 
    public static String SERVER_URL = "http://192.168.1.14:1337/parse/";
    public static String APP_ID = "myAppId";

提前致谢。

【问题讨论】:

你在 objectId 中得到任何值吗? @Le_Master 是的。 Log.i("objectId", objectId); --> I/objectId﹕wfBB0gpCkP 但无法从 done 回调方法外部访问它 【参考方案1】:

试试这个

ParseQuery<ParseObject> query = ParseQuery.getQuery("_Foo1234");
query.whereEqualTo("objectId","wfBB0gpCkP");
query.findInBackground(new FindCallback<ParseObject>() 
    public void done(List<ParseObject> objects, ParseException e) 
        if (e == null) 
            // row of Object Id "wfBB0gpCkP"
         else 
            // error
        
    
);

也改变

ParseQuery<ParseObject> query = ParseQuery.getQuery("Foo1234");

ParseQuery<ParseObject> query = ParseQuery.getQuery("_Foo1234"); 

看看这是否有效。

【讨论】:

但我不想硬编码对象 id "wfBB0gpCkP" 这行得通吗?如果是,请将硬编码的值替换为变量并尝试。 更新了答案。试试看。 有效!但第二行有问题。我已经更改了两个参数(更改为(“some string”,someObject))并且它仍在工作。我什至删除了那条线,它仍在工作。我认为有必要拥有对象 ID 来检索对象的值吗? (在官方文档中它说:“如果你有 objectId,你可以使用 ParseQuery 检索整个 ParseObject...”)【参考方案2】:

问题出在saveInBackground() 的“背景”部分。保存后的行中的保存未完成。事实上,它甚至还没有开始保存。在完成处理程序运行之前,保存不会完成。

考虑...

        // code here runs **first**
        gameScore.saveInBackground(new SaveCallback() 
        public void done(ParseException e) 
            // code here runs **third, much later than second**
            if (e == null) 
                objectId = gameScore.getObjectId();
             else 
                Log.e("saveInBackground", getErrorMessage(e));
            
        
        // code here runs **second, immediately**

在保存的完成处理程序中运行“get”查询,您会看到它有效。 (当然,没有太多理由获取该对象,因为您拥有刚刚调用 save 的对象的句柄。

【讨论】:

以上是关于解析“未找到查询结果(代码 101)”。无法获取对象 ID的主要内容,如果未能解决你的问题,请参考以下文章

应用宝 无法获取签名信息 360 解析证书为空!

url 中的特殊字符 % # & = ? / + 无法被后端解析问题分析及解决方法

DateTimeParseException:无法解析文本:无法从 TemporalAccessor 获取 LocalDateTime

Tomcat 无法解析POST请求的参数

我无法解析页面并获取链接 Nokogiri

无法解析智能卡获取响应 (TLV)