Javascript Dexie.js自动增量主键-它是否重置过?如何重置它?
在Dexie.js中,您可以使用自动递增键创建存储Javascript Dexie.js自动增量主键-它是否重置过?如何重置它?,javascript,indexeddb,dexie,Javascript,Indexeddb,Dexie,在Dexie.js中,您可以使用自动递增键创建存储 let db = new Dexie("nav_api"); db.version(1).stores({ jobs: '++id, json' }); 为了测试,我通过db.jobs.put({json:'[]})在db中创建了14个对象,它们的所有键都按预期的那样出现,从1开始到14。然后删除了(6.delete())上面的一些后面的文件,db.jobs.where('id'),并将另一个文件添加到
let db = new Dexie("nav_api");
db.version(1).stores({
jobs: '++id, json'
});
为了测试,我通过db.jobs.put({json:'[]})
在db中创建了14个对象,它们的所有键都按预期的那样出现,从1开始到14。然后删除了(6.delete())上面的一些后面的文件,db.jobs.where('id'),并将另一个文件添加到数据库中,其索引为15
有没有办法将索引重置为0?我用它来排序,我不确定当值变得非常大时会发生什么——它最终会回到0吗
另一方面,这也可能不是我需要担心的事情。取决于“++id”字段的高度,我假设它将达到数十亿,这将是许多年(许多生命期)之后才开始担心的事情。所以也许我应该忽略它
[编辑]
我尝试清除表,db.jobs.clear()
,然后在表中放入一个新行,但它再次使用了后面的下一个索引。我找不到完全删除表的方法,但是我可以完全删除整个数据库,但我真的不想这样做。
您可能不会达到上限:
当前数字始终是小于或等于253(9007199254740992)+1的正整数
除了删除对象存储并重新创建它之外,没有办法重置它:
密钥生成器的当前编号永远不会减少,除非数据库操作被还原。从对象存储中删除记录不会影响对象存储的密钥生成器。即使清除对象存储中的所有记录(例如使用clear()方法),也不会影响对象存储的密钥生成器的当前编号
被接受的答案只是部分地解决了问题,并没有以代码的形式提供问题的实际解决方案。在我看来,不需要计算自动递增的整数不是一个好主意。当然,一个人需要大量的数据,但高数据量可能会激怒用户,特别是当他们问自己以前的id在哪里时
我主要是从Dexie开发者dfahlander那里复制过来的,并对其进行了修改,以达到要求的效果。请注意,来回克隆数据库可能需要很长时间才能运行,具体取决于数据库的大小。bulkAdd未包装在事务中,因此一旦出现错误,脚本可能会中断也就是说,我必须警告您在执行此功能之前进行备份。
function refreshIndices(database){
const databases = [database, database+'_temp'];
// Loop 2 times - move database forth and back
(function next(cnt, max){
if(cnt++ >= max){ doSomething(); return;}
// ! turns 1 into 0 and vice-versa / + turns boolean into integer
var sdb = new Dexie(databases[cnt-1]),
ddb = new Dexie(databases[+!(cnt-1)]);
sdb.open().then(()=>{
// Clone scheme
const schema = sdb.tables.reduce((result,table)=>{
result[table.name] = (
[table.schema.primKey]
.concat(table.schema.indexes)
.map(indexSpec => indexSpec.src)
).toString();
return result;
}, {});
ddb.version(sdb.verno).stores(schema);
// Clone Data and delete source-database
return sdb.tables.reduce(
(result, table) => result
.then(() => table.toArray())
.then(rows => ddb.table(table.name).bulkAdd(rows) ),
Promise.resolve()
).then((x)=>{ sdb.delete(); ddb.close(); next(cnt,max); })
})
})(0, databases.length);
}
调用此函数时,必须使用要克隆的数据库名称作为字符串。(即,刷新索引('dbname')
)数据库必须存在。该函数迭代2次。在第一次运行时,将源数据库克隆到临时数据库中,然后删除源数据库。完成后,该函数将再次运行并将临时数据库克隆到源数据库中,然后删除临时数据库。不会留下任何开销
为了调试的目的,我会修改
.then(rows => ddb.table(table.name).bulkAdd(rows) )
到
这个函数应该与Dexie.js一起开箱即用。还可以通过开发者工具(Chrome)
=>应用程序=>索引数据库=>=>数据库名称=>刷新谢谢。这主要只是一个假设问题,这个数字太大了,对于我的用例,我绝对不会碰到它。
.then((rows) => {
console.log("Cloning "+table.name);
ddb.table(table.name).bulkAdd(rows)
}) )