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 - 仅更新选定的字段的主要内容,如果未能解决你的问题,请参考以下文章