使用sqlite db.replace而不在replace contentvalues

时间:2016-02-27 14:33:53

标签: java android sqlite replace

首先关闭。是否可以不为db.replace命令的contentvalues传递唯一值并让它更新现有行?

您似乎必须触发唯一约束才能使更新生效,否则命令会执行插入。

为什么我这么困惑是因为这对我来说(更新)db.replace并且我没有在contentvalues中发送唯一键。我在这里完全错了吗?我知道我从未发送它的原因是因为我甚至不知道如何从数据库中获取该值。

这是我的代码(创建新记录

        //Create the new tab record
        tabsValues.put(Contract.TabsTable.COLUMN_REFERENCE_ID, eTextCardDetails.getText().toString());
        tabsValues.put(Contract.TabsTable.COLUMN_TAB_CLOSED, 0);
        long newTabId = db.insert(Contract.TabsTable.TABLE_NAME, null, tabsValues); //Insert the records
        eTextOrderTabId.setText(String.valueOf(newTabId)); //Update the UI with the new Tab ID#

        //Create a new map of values for tablines
        cursor.moveToFirst();
        for(int i = 0; i < cursor.getCount(); i++ )
        {
            if(Integer.parseInt(editTextCount[i].getText().toString()) > 0)
            {
                int itemId = editTextCount[i].getId();
                int itemCount = Integer.parseInt(editTextCount[i].getText().toString());
                tabsLinesValues.put(Contract.TabsLinesTable.COLUMN_TAB_ID, newTabId); //Save the itemId in the DB
                tabsLinesValues.put(Contract.TabsLinesTable.COLUMN_ITEM_ID, itemId); //Save the itemId in the DB
                tabsLinesValues.put(Contract.TabsLinesTable.COLUMN_ITEM_COUNT, itemCount); //Save the itemCount in the DB
                //Insert the item details for the order in the db
                long newTabsLinesRow = db.insert(Contract.TabsLinesTable.TABLE_NAME, null, tabsLinesValues); //Insert the records
                Toast.makeText(this, "tabsLineId: " + newTabsLinesRow + " for itemId: " + itemId, Toast.LENGTH_SHORT).show();
                tabsLinesValues.clear();
            }
            cursor.moveToNext();
        }
        Toast.makeText(this, "Tab #" +newTabId+ " Started!", Toast.LENGTH_SHORT).show();
        cursor.close();
        finish();
    }catch (Exception erMsg)
    {
        erMsg.printStackTrace();
    }
}

这很好用。它按预期创建新行。这是我的更新方法,即更新已存在的记录并插入新记录。不幸的是,它总是插入新的行。

我想我明白这是因为我的保存没有唯一约束,因此它会插入新行。问题是我之前从未发送过唯一密钥,它正在更新以前的记录并插入以前不存在的新记录。如果我没有发送唯一密钥,您如何进行更新?

我最初使用的是db.update方法,但只更新了以前的行,我需要添加不存在的新行。我遇到了db.update并且工作正常,现在我无法使用它。

public void saveTab(View view)
{
    int tabId = Integer.parseInt(eTextOrderTabId.getText().toString());
    String[] argsItemId = {String.valueOf(tabId)};
    cursor.moveToFirst();
    try
    {
        ContentValues updateTabValues = new ContentValues(); //Create the new content values object
        //Create a new map of values for tablines
        for(int i = 0; i < cursor.getCount(); i++ )
        {
            if(Integer.parseInt(editTextCount[i].getText().toString()) > 0)
            {
                int itemId = editTextCount[i].getId();
                int itemCount = Integer.parseInt(editTextCount[i].getText().toString());
                updateTabValues.put(Contract.TabsLinesTable.COLUMN_TAB_ID, tabId);
                updateTabValues.put(Contract.TabsLinesTable.COLUMN_ITEM_ID, itemId);
                updateTabValues.put(Contract.TabsLinesTable.COLUMN_ITEM_COUNT, itemCount);
                //Update the item row details for each item in the tab
                db.replace(Contract.TabsLinesTable.TABLE_NAME, null, updateTabValues); //Insert the records
                updateTabValues.clear();
            }
        }
        Toast.makeText(this, "Tab #" +tabId+ " Saved!", Toast.LENGTH_SHORT).show();
        finish();
    }catch (Exception erMsg)
    {
        erMsg.printStackTrace();
    }
}

0 个答案:

没有答案