Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Dexie.js自动增量主键-它是否重置过?如何重置它?_Javascript_Indexeddb_Dexie - Fatal编程技术网

Javascript 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'),并将另一个文件添加到

在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'),并将另一个文件添加到数据库中,其索引为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)
}) )