Azure移动服务Android脱机示例 - 在SQLiteLocalStore中插入时为空ID

时间:2014-11-12 08:50:33

标签: android sqlite azure azure-mobile-services

当我在列表中“添加”一个新的toDoItem时,该项目不会从当时的本地数据库获得Id(null)。因此,如果您尝试编辑该项目,则会收到错误消息。 另一方面,如果添加新的toDoItem,然后“刷新”列表或编辑其他项目,则添加的新项目将获得Id。 我遵循的例子是:http://azure.microsoft.com/blog/2014/08/07/offline-support-in-azure-mobile-services-android-sdk/ 可能有什么不对?

当我按下“添加”按钮时,我可以创建一个随机ID并在每个ToDoItem中传递它,但我希望数据库在那时为我做。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

由于以下原因,可能导致错误。

  1. 博客的addItem功能存在错误。当您在本地数据库中插入项目时,它实际上会为其分配一个ID。当你在表上调用insert函数时,它返回一个带有id的对象。

    因此todoItem的插入应该如下所示。

    final ToDoItem entity = mToDoTable.insert(item).get();

  2. addItem函数的正确版本如下所示

    public void addItem(View view) {
                if (mClient == null) {
                    return;
                }
    
                // Create a new item
                final ToDoItem item = new ToDoItem();
                item.setText(mTextNewToDo.getText().toString());
                item.setComplete(false);
    
                // Insert the new item
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
                        try {
                            final ToDoItem entity = mToDoTable.insert(item).get();
                            if (!entity.isComplete()) {
                                runOnUiThread(new Runnable() {
                                    public void run() {
                                        mAdapter.add(entity);
                                    }
                                });
                            }
                        } catch (Exception exception) {
                            createAndShowDialog(exception, "Error");
                        }
                        return null;
                    }
                }.execute();
                mTextNewToDo.setText("");
            }
    
    1. Android SDK(https://github.com/Azure/azure-mobile-services/issues/505)存在错误。根据您的移动服务和客户端表定义应该匹配。当您创建todoItem表时,它会添加&#34; __已删除&#34;列默认情况下。您可以在客户端中定义列,也可以从todoItem表中删除它。