如何使用后引用的批量插入工作?

时间:2014-11-18 11:39:40

标签: java android sqlite android-sqlite sqliteopenhelper

这是我的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?

非常感谢帮助,文档不是很清楚..

1 个答案:

答案 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());