如何只修改 dexie 商店中的一个属性而不删除其余部分?

Posted

技术标签:

【中文标题】如何只修改 dexie 商店中的一个属性而不删除其余部分?【英文标题】:How to modify just a property from a dexie store without deleting the rest? 【发布时间】:2021-08-22 14:16:43 【问题描述】:

我在下面的打印屏幕中显示了 dexie 商店:

Dexie stores print screen

我的目标是在不丢失其余数据的情况下从商店更新 dexie 字段行。

例如:当我从第二行(key=2)编辑并保存字段“com_name”时,我只想更新“com_name”而不丢失其余属性,请参见第一行和第三行.

我已经尝试使用 collection.modify 和 table.update,但在使用以下代码时都删除了其余属性:

dexieDB.table('company').where('dexieKey').equals('1')   
//USING table.update
//.update(dexieRecord.dexiekey, 
//    company: 
//        com_name: "TOP SERVE 2"
//    
//)
.modify(
    
        company:
        
            com_name: TOP SERVE 2
        
    
)
.then(function (updated) 
    if (updated)
        console.log("Success.");
    else
        console.log("Nothing was updated.");
)
.catch(function (err)  console.log(err); );

知道我该怎么做吗?

谢谢 亚历克斯

【问题讨论】:

【参考方案1】:

鉴于 JSON 数据,我明白出了什么问题。

而不是将以下内容传递给 update():


    company:
    
        com_name: "TOP SERVE 2"
    
 

你可能想通过这个:

 
    "company.com_name": "TOP SERVE 2"
 

另一个提示是在 rw 事务中进行添加,如果您可以使用 bulkAdd() 来优化性能,效果会更好。

【讨论】:

修改的三个文档(也适用于更新)举例说明了如何更新嵌套属性。 dexie.org/docs/Collection/…【参考方案2】:

既然你说我意识到公司和联系人存储是动态创建的,并且editedRecords 存储具有明确声明的索引,因此在更新公司或联系人存储时,因为 dexie 看不到索引将被覆盖。我尚未对其进行测试,但我怀疑这是行为。

请参阅下面的打印屏幕:

Dexie stores overview

基本上我有来自 db 的 json 原始数据,在浏览器中我创建商店并基于它存储数据,请参见下面的代码:

function createDexieTables(jsonData)   //jsonData - array, is the json from db
    const stores = ;
    const editedRecordsTable = 'editedRecords';

    jsonData.forEach((jsonPackage) => 
      for (table in jsonPackage) 
        if (_.find(dexieDB.tables,  'name': table ) == undefined) 
          stores[table] = 'dexieKey';
        
      
    );

    stores[editedRecordsTable] = 'dexieKey, table';
    addDataToDexie(stores, jsonData);
   

function addDataToDexie(stores, jsonData) 
    dbv1 = dexieDB.version(1);

    if (jsonData.length > 0) 
        dbv1.stores(stores);

        jsonData.forEach((jsonPackage) => 
            for (table in jsonPackage) 
                jsonPackage[table].forEach((tableRow) => 
                    dexieDB.table(table).add(tableRow)
                        .then(function () 
                            console.log(tableRow, ' added to dexie db.');
                        )
                        .catch(function () 
                            console.log(tableRow, ' already exists.');
                        );
                );
            
        );
    

这是json,我把它转成object,保存到dexie的value列,key是“dexieKey”:

[
  
    "company": [
      
        "dexieKey": "1",
        "company": 
          "com_pk": 1,
          "com_name": "CloudFire",
          "com_city": "Round Rock",
          "serverLastEdit": [
            
              "com_pk": "2021-06-02T11:30:24.774Z"
            ,
            
              "com_name": "2021-06-02T11:30:24.774Z"
            ,
            
              "com_city": "2021-06-02T11:30:24.774Z"
            
          ],
          "userLastEdit": []
        
      
    ]
  
]

知道为什么动态生成索引时没有填充索引吗?

【讨论】:

【参考方案3】:

您有权使用 Table.update 或 Collection.modify。他们不应该删除指定属性以外的其他属性。您能否粘贴一个 jsitor.com 或 jsfiddle 复制品,有人可以帮助您查明代码无法按预期工作的原因。

【讨论】:

见我上面的评论。

以上是关于如何只修改 dexie 商店中的一个属性而不删除其余部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Zsh 中的 $PATH 中删除路径并将其添加到开头而不重复?

删除包含外键的字段,而不删除该字段包含LARAVEL的所有项目

Vue 中的反应式 Dexie-Query

如何构建 nativescript-vue .apk 而不将其提交到谷歌商店与我的朋友分享以进行 beta 测试

Dexie JS - 结合条件过滤器和文本搜索

Dexie:如何跨多个浏览器引用一个 dexie db?