java如何让带有反向引用的BatchInsert工作?
以下是我已经花了数小时研究的Android问题:
我在表车中插入对象,然后在表驱动程序中插入对象。我需要正确设置驾驶员的外键,以参考刚刚插入的车行。此外,如果无法保存在行驾驶员,也不应保存车辆。(transactiomn语义)
我正在使用ContentProvider方法
我知道我应该使用批插入和withValueBackReference
来完成这项任务
示例代码:
// (populate carData obejct..)
ArrayList<ContentProviderOperation> opList = new
ArrayList<ContentProviderOperation>();
ContentValues carv = new ContentValues();
carv.put(Car.CAR_MAKE, carData.make);
carv.put(Car.CAR_MODEL, carData.model);
carv.put(BaseColumns._ID, 0); // this HAS to be here or withBackValues doesn't work
opList.add(ContentProviderOperation.newInsert(Car.CONTENT_URI).withValues(carv).build());
ContentValues driverv = new ContentValues();
driverv.put(Driver.DRIVER_NAME, carData.driverName);
driverv.put(Driver.DRIVER_CAR_FK, 0); // THIS should set the ID of the car above!
opList.add(ContentProviderOperation. newInsert(Driver.CONTENT_URI).withValues(driverv)
.withValueBackReference(Driver.DRIVER_CAR_FK, 0).build());
//... applyBatch etc.
如果我漏掉carv.put(BaseColumns._ID, 0)
,它就不起作用了。如果我保留它,我必须设置AUTO INCREMENT
将分配的值。(驱动程序。_ID设置为主键。)
所以我的问题是
当我插入CARS
行时,如何让CARS
行设置自己的_ID,并在批的第二次插入中引用这个ID
非常感谢您的帮助,文档不是很清楚
# 1 楼答案
这可能太晚了,帮不上忙,但你似乎有正确的想法。从您的示例来看,您的db命名方案有点令人困惑。您不需要
carv.put(BaseColumns._ID, 0);
,因为数据库应该为您创建这个值。你也不需要把driverv.put(Driver.DRIVER_CAR_FK, 0);
放进去,尽管这不会造成伤害——根据docs的值,返回引用优先。如果仍然存在问题,那么可能是因为数据库中外键的设置方式