【问题标题】:Parse.com ParseQuery inconstancyParse.com ParseQuery 不稳定
【发布时间】:2014-07-17 02:14:12
【问题描述】:

我的情况很奇怪。我有一个应用程序,我正在实施“通知历史”。

我有一个单独的应用程序,它向目标频道发送推送通知,然后在名为 Notifications 的表中创建一个条目,保存目标频道和发送的消息。

channels = channelEditText.getText().toString();
                message = messageEditText.getText().toString();
                ParsePush push = new ParsePush();
                push.setChannel(channels);
                push.setMessage(message);
                push.sendInBackground();
                channelEditText.setText("");
                messageEditText.setText("");

                ParseObject notifications = new ParseObject("Notifications");
                notifications.add("channels", channels);
                notifications.put("msg", message);
                notifications.saveInBackground();

然后我的 Android 应用的“通知历史”片段执行

ParseQueryAdapter<ParseObject> notificationAdapter =
            new ParseQueryAdapter<ParseObject>(getActivity(), new ParseQueryAdapter.QueryFactory<ParseObject>() {
                public ParseQuery<ParseObject> create() {
                    ParseQuery query = new ParseQuery("Notifications");
                    query.whereContainedIn("channels", ParseInstallation.getCurrentInstallation().getList("channels"));
                    query.orderByDescending("createdAt");
                    return query;
                }
            });
        notificationAdapter.setTextKey("msg");
        ListView notificationListView = (ListView) rootView.findViewById(R.id.notificationListView);
        notificationListView.setAdapter(notificationAdapter);

我的 ParseApplication.java 在安装时为用户订阅频道:“欢迎”,因此我没有收到空指针。带有“欢迎”频道的通知表条目填充列表视图。

我有两种订阅频道的方法。一种方法是像这样在设备本身上

final EditText syncInput = (EditText) rootView.findViewById(R.id.syncInput);
        Button syncButton = (Button) rootView.findViewById(R.id.syncButton);

        syncButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v){

                String sync = null;
                sync = syncInput.getText().toString();
                PushService.subscribe(getActivity(), sync, DashboardActivity.class);
                syncInput.setText("");
            }

        });

另一种方式是通过 CloudCode

Parse.Cloud.define("subscribeToChannel", function(request, response){
var channelName = request.params.channel;
var userId = request.params.userId;

if(!channelName) {
    response.error("Missing parameter: channel");
    return;
}

if (!userId) {
    response.error("Missing paremeter: userId");
    return;
}

//Create a Pointer to the user based on their object id
var user = new Parse.User();
user.id = userId;

Parse.Cloud.useMasterKey();

// A user might have more than one installation
var query = new Parse.Query(Parse.Installation);
query.equalTo("user", user); //Match Installations with a pointer to this User
query.find({
    success: function(installations) {
        for (var i = 0; i < installations.length; i++) {
            //Add the channel to al the installations for this user
            installations[i].addUnique("channels", channelName);
        }

        //Save all the installations
        Parse.Object.saveAll(installations, {
            success: function(installations) {
                //All the installations where saved.
                response.success("All the installations were updated with this channel.");
            },
            error: function(error) {
                //An error occured while saving one of the objects.
                console.error(error);
                response.error("An error occured while updating this user's installations.");
            }
        });
    },
    error: function(error) {
        console.error(error);
        response.error("An error occurred while looking up this user's installations");
    }
});

});

两种订阅方式都是成功的,因为发送到目标频道的推送通知到达设备。这是问题...如果我使用设备订阅我的查询将显示发送到保存在通知表中的该频道的消息。如果我使用 CloudCode,我的查询不会显示发送到保存在通知表中的通道的消息。

我被难住了。任何帮助都深表感谢。

--------------------------------解决方案-------------- ----------------------------------

protected void onResume() {
     super.onResume();
    ParseInstallation.getCurrentInstallation().refreshInBackground(new RefreshCallback(){

        @Override
        public void done(ParseObject parseObject, ParseException e) {
             List<String> channels = ParseInstallation.getCurrentInstallation().getList("channels");
                for (int i = 0; i < channels.size(); i++) {
                    Log.w("TEST", channels.get(i));

        }
        }
    });
}

【问题讨论】:

    标签: android parse-platform


    【解决方案1】:

    您正在 Cloud Code 中的服务器端编辑安装记录,但设备未获取更新的数据。如果这是您应用中的常见行为,请在加载应用时刷新安装对象:

    ParseInstallation.getCurrentInstallation().refreshInBackground();
    

    或fetchInBackground,如下图:https://parse.com/docs/android_guide#objects-retrieving

    这也可以通过调用执行查询的云函数而不是从设备查询来解决(更新的频道列表已经在服务器端。)

    【讨论】:

    • 感谢您的帮助。
    • 我用过这个 ParseInstallation.getCurrentInstallation().refreshInBackground();但是出现 refreshInBackground 的错误已被弃用,还有其他解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2017-05-11
    • 2011-01-20
    • 2018-11-26
    • 2016-10-18
    • 2011-01-16
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多