【问题标题】:Update single column of IndexedDb records using id key使用 id 键更新 IndexedDb 记录的单列
【发布时间】:2014-03-29 05:16:04
【问题描述】:

我想知道如何更新像(UPDATE TABLE SET column_name= MyNewValue WHERE ID=MyKey) 这样的IndexedDB 记录。我想使用键更新对象中的单个属性..

在尝试使用光标更新时,我收到了这个错误,

未捕获的数据错误:无法在“IDBCursor”上执行“更新”:此游标的有效对象存储使用内联键,并且评估值参数的键路径导致与游标的有效值不同键。

【问题讨论】:

    标签: indexeddb


    【解决方案1】:

    感谢您提供错误信息。如果没有看到您的对象存储创建代码,我无法肯定地说,但我对这类问题非常熟悉。

    这意味着您没有使用自动递增密钥,而是自己提供密钥。这是很正常的。在这种情况下,您使用以下IDBCursor.update()signature

    cursor.update(your_updated_entry_object);
    

    IDB 知道要更新哪个条目,因为您的密钥在 your_updated_entry_object 上“内联”(这意味着 your_updated_entry_object 有一个属性是您的密钥)。

    听起来您可能已经看到了IDBStore.put() 方法并且感到困惑。对于所谓的“内联密钥”(您拥有的)和“外联”密钥(如果您让 IDB 为您自动增加密钥,您会得到什么),这需要两个单独的签名。

    使用内嵌密钥,它与IDBCursor.update() 的签名相同:

    store.put(your_updated_entry_object);
    

    但是,使用外键,它需要一个额外的 key 参数,告诉 IDB 更新哪个对象(因为您不在游标上,否则没有您的请求的上下文):

    store.put(your-updated_entry_object, your_autoincremented_key);
    

    【讨论】:

      【解决方案2】:

      是的,光标上的update 方法具有误导性,因为它表明内联主键也可以更改。有a lengthy discussion是否允许根据方法改变主键。

      其实如果允许更改主键,那就更混乱了,所以it is not allowed。唯一的方法是删除并创建一个新的。其他键值存储也是同样的概念。

      如果此游标的有效对象存储使用内联键并且评估 value 参数的键路径导致与游标的有效键不同的值,则实现必须抛出 DataError 类型的 DOMException。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        相关资源
        最近更新 更多