Javascript YDN-DB如何更新单个字段?
我一直试图使用Javascript YDN-DB如何更新单个字段?,javascript,asynchronous,indexeddb,ydn-db,Javascript,Asynchronous,Indexeddb,Ydn Db,我一直试图使用db.put()更新单个字段,但无法使其正常工作。每次我用给定的ID更新单个字段时,它都会删除所有其他条目。下面是一个示例代码: var schema = { stores: [ { name: 'items', keyPath: 'id' }, {
db.put()
更新单个字段,但无法使其正常工作。每次我用给定的ID更新单个字段时,它都会删除所有其他条目。下面是一个示例代码:
var schema = {
stores: [
{
name: 'items',
keyPath: 'id'
},
{
name: 'config',
keyPath: 'id'
}
]
};
var db = new ydn.db.Storage('initial', schema);
var items = [{
id: 1,
itemId: 'GTA5',
date:'03/25/2013',
description:'Great game'
}, {
id: 2,
itemId: 'Simcity',
date:'12/01/2012',
description:'Awesome gameplay'
}];
var config = {
id: 1,
currency: 'USD'
};
db.put('items', items);
db.put('config', config);
var updateTable = function(){
var req = $.when(db.count('items'),db.values('items'),db.get('config', 1));
var disp = function(s) {
var e = document.createElement('div');
e.textContent = s;
document.body.appendChild(e);
};
req.done(function(count,r,config) {
var currency = config.currency;
if(count > 0){
var n = r.length;
for (var i = 0; i < n; i++) {
var id = r[i].id;
var itemId = r[i].itemId;
var date = r[i].date;
var description = r[i].description
disp('ID: '+id+' itemID: '+itemId+' Currency: '+currency+' Date: '+date+' Description: '+description);
}
}
});
}
updateTable();
$('a').click(function(e){
e.preventDefault();
db.put('items',{id:2,description:'Borring'}).done(function(){
updateTable();
});
});
var模式={
商店:[
{
名称:'项目',
密钥路径:“id”
},
{
名称:'config',
密钥路径:“id”
}
]
};
var db=新的ydn.db.Storage('initial',schema);
可变项目=[{
id:1,
itemId:'GTA5',
日期:2013年3月25日,
描述:'伟大的游戏'
}, {
id:2,
itemId:'模拟城市',
日期:2012年1月12日,
描述:'awesomegameplay'
}];
变量配置={
id:1,
货币:美元
};
db.put(“项目”,项目);
db.put('config',config);
var updateTable=函数(){
var req=$.when(db.count('items')、db.values('items')、db.get('config',1));
var disp=功能{
var e=document.createElement('div');
e、 textContent=s;
文件.正文.附件(e);
};
请求完成(功能(计数、r、配置){
var currency=config.currency;
如果(计数>0){
var n=r.长度;
对于(变量i=0;i
下面是一个正在发生的工作示例。如果单击“更改”链接,指定的字段将更新,但所有其他字段都“未定义”是的,SimCity现在很无聊,但明天将再次带来兴奋 IndexedDB本质上是一个独立的数据库。你必须读或写一个记录作为一个整体。无法仅更新某些字段。事件如果您想要小的更新,您必须读写整个记录 读取和写回整个记录是可以的,但有一个重要的考虑因素是一致性。回写时,必须确保您的记录未被其他线程修改。即使javascript是单线程的,因为读和写操作都是异步的,并且每个操作可能具有不同的数据库状态。这似乎极为罕见,但经常发生。例如,当用户单击时,不会发生任何事情,然后再次单击。从异步数据库的角度来看,这些用户交互排队并并行执行 一种常见的技术是对两个操作使用单个事务。在YDN-DB中,您可以通过三种方式进行操作 使用显式事务:
db.run(function(tx_db) {
tx_db.get('items', 2).done(function(item) {
item.description = 'boring until Tomorrow';
tx_db.put(item).done(function(k) {
updateTable();
}
}
}, ['items'], 'readwrite');
使用原子数据库操作:
var iter = ydn.db.ValueIterator.where('items', '=', 2);
db.open(function(cursor) {
var item = cursor.getValue();
item.description = 'boring until Tomorrow';
cursor.update(item);
}, iter, 'readwrite');
编辑:
使用查询包装器:
db.from('items', '=', 2).patch({description: 'boring until Tomorrow'});
有没有一种方法可以将其封装在函数中,以便反复使用?如果是这样的话,在小提琴上做一个有效的例子是不是要求太多了?我只是从异步编程开始,它有时有点让人不知所措。老实说,您的API非常棒,非常适合我的项目。谢谢看起来是个不错的建议。A在查询包装器中添加了
补丁
方法。有关详细信息,请参见文档:谢谢。这看起来很神奇,我可以添加一个回调到patch()
?所以我可以在更新完成后执行其他函数?谢谢,祝你今天愉快!对你可以。在本例中,它很简单,因为只有一个查询结果。