не могу обновить данные в базе данных Kinvey

Я пытаюсь обновить запись в коллекции kinvey, но она продолжает говорить о недостаточных учетных данных. Я нашел аналогичный вопрос на форуме, в котором говорилось, что я должен установить GloballyWriteable для acl моей модели. Я сделал это, но ошибка все еще есть, вот мой код

public void loadMenuHelper(){
    menu_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final Order order = my_orders[position];
            order.getAcl().setGloballyWriteable(true);
            order.getAcl().setGloballyReadable(true);
            int requests = order.getRequests();
            ////////////have the handler
            AlertDialog.Builder alert = new AlertDialog.Builder(
                    new ContextThemeWrapper(ImageTargets.this, R.style.AlertDialogCustom));

            LinearLayout layout = new LinearLayout(ImageTargets.this);
            layout.setOrientation(LinearLayout.VERTICAL);
            alert.setTitle("There are " + requests + "Before you");
            alert.setView(layout);
            alert.setPositiveButton("Create", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    ///////////////
                    order.getAcl().setGloballyWriteable(true);
                    order.getAcl().setGloballyReadable(true);
                    order.setRequests(order.getRequests() + 1);
                    AsyncAppData<Order> myevents = mKinveyClient.appData("Order", Order.class);
                    myevents.save(order, new KinveyClientCallback<Order>() {
                        @Override
                        public void onFailure(Throwable e) {
                            Log.i("TAG", "failed to save event data" + e.getMessage());
                            Log.i("TAG", sharedpreferences.getString("owner_name", ""));
                        }

                        @Override
                        public void onSuccess(Order r) {
                            Log.d("TAG", "saved data for entity " + r.getName());
                            Toast.makeText(getApplicationContext(), "Your Order was Created Sucessfully", Toast.LENGTH_SHORT).show();
                        }
                    });

                }
                ////////////


            });

            alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    // what ever you want to do with No option.
                }
            });

            alert.show();
            ////////////////

        }
    });
    ///////////////
}

person Soha Gharib    schedule 16.03.2016    source источник


Ответы (1)


Учитывая, что у вас есть пользователь, правильно вошедший в систему, это, похоже, связано с разрешениями на сбор.

Ваша коллекция находится в общем режиме, поэтому вы можете прочитать объект заказа, созданный кем-то другим. Но, поскольку только создатель может изменить объект, вы получаете сообщение об ошибке «недостаточно учетных данных».

Здесь у вас есть два варианта. Первый вариант — изменить разрешения коллекции на общедоступные, чтобы любой мог редактировать любой объект заказа. Вы можете сделать это в веб-консоли Kinvey, перейдя на вкладку настроек в браузере данных для коллекции заказов. После этого вам не нужно будет использовать setGloballyWriteable/setGloballyReadable.

Другой вариант (на мой взгляд, более подходящий) — создать еще одну коллекцию для запросов на конкретные заказы. В этой новой коллекции вы сможете хранить ссылку на объект заказа, а также хранить пользовательскую информацию о пользователе, запросившем его.

Вы можете найти необходимую документацию, связанную с разрешениями на сбор, здесь - http://devcenter.kinvey.com/android/guides/security

person Wani    schedule 17.03.2016
comment
Большое спасибо, я не знал, что я могу обновить его с консоли kinvey, но знаете ли вы, почему я не могу сделать только одну запись в своей базе данных общедоступной? почему setGlobalWritable не работал? - person Soha Gharib; 17.03.2016
comment
Поскольку коллекция была в общем режиме, это будет работать, только если вы являетесь создателем этой записи. Если вы переключитесь в общий режим, создадите заказ и попытаетесь запросить его (который сработает setGloballyWriteable) в этом заказе с тем же пользователем, он будет работать. - person Wani; 18.03.2016