Android/Ormlite - 仅更新选定的字段

Posted

技术标签:

【中文标题】Android/Ormlite - 仅更新选定的字段【英文标题】:Android/Ormlite - update only selected fields 【发布时间】:2016-01-05 12:31:53 【问题描述】:

我对表 Shops 的列定义:

@DatabaseField(canBeNull = false, columnName = C_SHOP_ID, index=true, id=true)
private String shopId;

@DatabaseField(dataType = DataType.BYTE_ARRAY, canBeNull = false, columnName = C_SHOP_ICON)
private byte[] shopIcon;

@DatabaseField(canBeNull = false, columnName = C_SHOP_DETAILS)
private String shopDetails;

@DatabaseField(canBeNull = false, columnName = C_SHOP_NAME)
private String shopName;

@DatabaseField(canBeNull = false, columnName = C_SHOP_SHORT_DESCRIPTION)
private String shopShorDescription;

接下来,执行更新(或插入)新行:

public void addOrUpdateShop(Shops c)

    try
    
        //getHelper().getShopItemsDao().create(c);
        getHelper().getShopItemsDao().createIfNotExists(c);
    
    catch (SQLException e)
    
        e.printStackTrace();
    

有时,执行更新时并非所有字段都需要更改。例如,不应更新 shopDetails 或 shopIcon(大 blob 图像)并保持原样。这由特定的字段值指示。例如,如果 c.shopDetails 不应该在数据库中更新,它的值是 "no change"

现在我需要更新行,但是每次c.ShopDetails等于"no change"时,我表中的shopDetails字段不应该更新,所以表中的字段值不会改变。不过其他字段应该更新。

如果没有 ormlite,我需要编写所有相应的更新查询,以便根据需要从更新语句中排除某些列。有没有什么简单的方法可以用 ormlite 做同样的事情(不写原始的 sql 查询)?

另外,如果不存在,我需要创建新行(因此,更新构建器并不适合,因为我只能用它更新现有字段)

【问题讨论】:

【参考方案1】:

假设您需要更新 shop id 为 25 的 shop 对象的 shopeName。

然后首先您需要检索 Shop id = 25 的 Shop 对象 那么如果有这样的对象,想象一下检索到的 Shpops 对象为 oldShopObject。

现在您创建名为 newShopObject 的新商店对象,如下所示

Shops newShopObject = new Shpos();
newShopObject.shopId = oldShopObject.shopId;
newShopObject.shopIcon = oldShopObject.shopIcon;
newShopObject.shopDetails = oldShopObject.shopDetails;
newShopObject.shopeName = <set your new shop name here>;
newShopObject.shopShortDescription   = oldShopObject.shopShortDescription;

现在您可以保存这个 newShopObject。 如下更新你的代码并尝试,

public void addOrUpdateShop(Shops newShopObject)

 try
 
    getHelper().getShopItemsDao().createOrUpdate(newShopObject);
 
 catch (SQLException e)
 
    e.printStackTrace();
 

阅读here

【讨论】:

对不起,你能解释一下吗?如何从更新中排除某些字段,与我之前的解决方案有什么区别? 好的,但仍然更新替换行中的所有字段,具有相同的值 + 只有其中一个(名称)具有新值。这不是我想要的,我只想更新选定的字段,而不是用相同的值替换其他字段。另外,我想避免选择旧对象。 我明白了,但是您无法在 ormLite 中实现插入新记录或更新具有相同查询/代码的记录。您必须使用 UpdateBuilder 更新选定字段并使用 create() 插入新记录。可能有点乱,但我的解决方案将为您带来相同的代码行

以上是关于Android/Ormlite - 仅更新选定的字段的主要内容,如果未能解决你的问题,请参考以下文章

Android—Ormlite框架简单的操作数据库

android ORMlite的应用

Binded DataGridView仅更新当前选定的行

选定的 WPF 列表框绑定仅更新视图中的项目

android OrmLite 入门

android OrmLite 实际应用