LitePal
LitePal copied to clipboard
LitePal.saveAll方法能不能将判断是insert还是update改为用主键去判断? 从服务器拉取一堆数据集体保存时第一遍没问题,第二遍就报错啦SQLITE_CONSTRAINT_UNIQUE
LitePal.saveAll方法能不能将判断是insert还是update改为用主键去判断? 从服务器拉取一堆数据集体保存时第一遍没问题,第二遍就报错啦SQLITE_CONSTRAINT_UNIQUE
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
LitePal.saveAll方法能不能将判断是insert还是update改为用主键去判断? 从服务器拉取一堆数据集体保存时第一遍没问题,第二遍就报错啦SQLITE_CONSTRAINT_UNIQUE
你好 请问这个你有解决方案了吗?
这是来自QQ邮箱的假期自动回复邮件。 您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
public <T extends LitePalSupport> void onSaveAll(Collection<T> collection) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { if (collection != null && collection.size() > 0) { LitePalSupport[] array = collection.toArray(new LitePalSupport[0]); LitePalSupport firstObj = array[0]; String className = firstObj.getClassName(); List<Field> supportedFields = getSupportedFields(className); List<Field> supportedGenericFields = getSupportedGenericFields(className); Collection<AssociationsInfo> associationInfos = getAssociationInfo(className); for (LitePalSupport baseObj : array) { if (!baseObj.isSaved()) { //所有新的数据都会走save方法,因为进来的数据的 baseObjId默认都为0, isSaved()返回false。 analyzeAssociatedModels(baseObj, associationInfos); doSaveAction(baseObj, supportedFields, supportedGenericFields); analyzeAssociatedModels(baseObj, associationInfos); } else { //没有机会进入doUpdateAction analyzeAssociatedModels(baseObj, associationInfos); doUpdateAction(baseObj, supportedFields, supportedGenericFields); } baseObj.clearAssociatedData(); } } }
我的解决方法是,继承自LitePalSupport的类都去重写isSaved,根据数据原本的主关键字去查询数据,如果存在则assignBaseObjId即设置自动生成的主键,此时就可以走doUpdateAction了
我现在也是按楼上这个思路去规避这个问题;在同步数据更新时就显得特别鸡肋:
新拉取的数据为 newItem
1.根据业务条件查询该条数据是否已存在(变量为 oldItem)
2.把 oldItem 的主键赋值给 newItem
newItem.assignBaseObjId(oldItem.id)
3.再执行 newItem.save() 或 LitePal.saveAll(newItem) LitePal就会自动【存在则更新,不存在则插入】