我想知道如何更新像(UPDATE TABLE SET column_name= MyNewValue WHERE ID=MyKey)
这样的IndexedDB记录。我想使用密钥更新对象中的单个属性..
尝试使用Cursor进行更新时,我收到此错误,
未捕获的DataError:无法执行'更新' on' IDBCursor':此光标的有效对象存储使用内嵌键,并且评估值参数的键路径会产生与光标的有效键不同的值。
答案 0 :(得分:4)
感谢您提出错误。在没有看到您的对象存储库创建代码的情况下,我无法肯定地说,但我对这类问题非常熟悉。
这意味着您不使用自动递增键,并自行提供密钥。这很正常。在这种情况下,您使用以下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);
答案 1 :(得分:0)
是的,光标上的update
方法具有误导性,因为它表明内联主键也可以改变。有a lengthy discussion是否允许根据方法更改主键。
实际上,如果允许更改主键,则更加令人困惑,因此it is not allowed。唯一的方法是删除并创建一个新的。它也是其他键值存储的概念。
如果此游标的有效对象存储使用内联键并且评估value参数的键路径导致的值与游标的有效键不同,则实现必须抛出DataError类型的DOMException。