我正在使用Room库(MVVM模式),并且Dao函数之一返回此错误消息:
android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: UPDATE parcel_table SET possibleDeliveryPersonsList = ?,? WHERE id = ?
这是Dao代码:
@Dao
public interface ParcelDao {
@Insert
void insert(Parcel parcel);
@Delete
void delete(Parcel parcel);
@Query("UPDATE parcel_table SET shippingDate=:shippingDate WHERE id = :id")
void updateShippingDate(String shippingDate, int id);
@Query("UPDATE parcel_table SET parcelStatus=:status WHERE id = :id")
void updatePackageStatus(Enums.ParcelStatus status, int id);
@Query("UPDATE parcel_table SET deliveryPersonName=:deliveryPersonName WHERE id = :id")
void updateDeliveryPersonName(String deliveryPersonName, int id);
@Query("UPDATE parcel_table SET possibleDeliveryPersonsList = :possibleList WHERE id = :tid")
void updatePossibleDeliveryPersonsList(List<String> possibleList, int tid);
@Query("DELETE FROM parcel_table")
void deleteAllParcels();
@Query("SELECT * from parcel_table")
LiveData<List<Parcel>> getParcels();
}
这是包裹类的一部分:
@Entity(tableName = "parcel_table")
public class Parcel {
private Enums.ParcelType parcelType;
private boolean isFragile;
private Enums.ParcelWeight parcelWeight;
private LatLng warehouseLocation;
private String recipientName;
private LatLng recipientAddress;
private String recipientEmail;
private String recipientPhone;
private String dateReceived;
private String shippingDate;
private Enums.ParcelStatus parcelStatus;
private String deliveryPersonName;
private String fireBasePushId;
private List<String> possibleDeliveryPersonsList;
@PrimaryKey(autoGenerate = true)
@NonNull
private int id;
//and more...
}
List<String>
类型转换器:
@TypeConverter
public String listToString(List<String> list) {
String joined = TextUtils.join(", ", list);
return joined;
}
@TypeConverter
public List<String> stringToList(String string) {
List<String> myList = new ArrayList<String>(Arrays.asList(string.split(",")));
return myList;
}
我不知道该怎么办,因为SQLite代码据说是由Dao自动生成的,而我对此没有任何影响...
Query批注的文档解释了Room参数绑定的功能:
作为对SQLite绑定参数的扩展,Room支持绑定查询的参数列表。在运行时,Room将构建正确的查询具有匹配数量的绑定参数,具体取决于方法参数中的项目数。
此功能可能打算在where子句中使用(如文档示例中所示,但是似乎在查询语句中的所有地方都应用。
在您的情况下,期望的行为是让Room应用您的类型转换器,但是Room忽略类型转换器并生成特殊列表绑定。
我认为您将不得不解决当前Room实施的这一局限性。您可能想要写Room bug-report以确认此处提供的解释正确。
将使用类型转换器的解决方法的一个选择是定义此类:
public class DeliveryPersonsUpdate {
public int id;
public List<String> deliveryPersons;
public DeliveryPersonsUpdate(int id, List<String> deliveryPersons) {
this.id = id;
this.deliveryPersons = deliveryPersons;
}
}
然后将此方法添加到您的Dao:
@Update(entity = Parcel.class)
void update(DeliveryPersonsUpdate update);
示例调用:
db.ParcelDao().update(new DeliveryPersonsUpdate(id, personsList);