这是我的Android问题,我已经花了好几个小时了:
我在表CARS中插入对象,然后是表DRIVERS中的对象。我需要正确设置DRIVERS的外键来引用CARS中刚刚插入的行。此外,如果无法保存DRIVERS中的行,则也不应保存CARS。 (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
。 (Driver._ID设置为主键。)
所以我的问题是,
当我插入CARS
时,如何让DRIVER
行设置自己的_ID,并在批次的第二个插入中引用此ID?
非常感谢帮助,文档不是很清楚..
答案 0 :(得分:0)
这可能为时已晚,无法提供帮助,但您似乎有正确的想法。从您的示例中,您的数据库命名方案有点令人困惑。您不应该需要carv.put(BaseColumns._ID, 0);
,因为数据库应该为您创建此值。您也不需要放driverv.put(Driver.DRIVER_CAR_FK, 0);
虽然它不会受到伤害 - 根据docs值,返回引用优先。如果仍有问题,那可能是因为数据库中的外键设置方式。
ArrayList<ContentProviderOperation> opList = new
ArrayList<ContentProviderOperation>();
ContentValues carv = new ContentValues();
carv.put(Car.CAR_MAKE, carData.make);
carv.put(Car.CAR_MODEL, carData.model);
opList.add(ContentProviderOperation.newInsert(Car.CONTENT_URI).withValues(carv).build());
ContentValues driverv = new ContentValues();
driverv.put(Driver.DRIVER_NAME, carData.driverName);
opList.add(ContentProviderOperation.newInsert(Driver.CONTENT_URI)
.withValues(driverv)
.withValueBackReference(Driver.DRIVER_CAR_FK, 0).build());