【发布时间】:2020-09-13 18:27:06
【问题描述】:
我正在使用 Room 库(MVVM 模式),其中一个 Dao 函数返回此错误消息:
android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: UPDATE parcel_table SET possibleDeliveryPersonsList = ?,? WHERE id = ?
这是道代码:
@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();
}
这是 Parcel 类的一部分:
@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 自动生成的,我对它没有任何影响......
【问题讨论】:
-
您是否使用TypeConverter 来处理数据库中
List<String>值的存储?如果是这样,请更新您的帖子以包含它的代码。 -
今天结束了。我明天再看看这个。我能够重现该错误。 Room 似乎不支持您想要的行为。如果您查看生成的查询代码(在文件
ParcelDao_impl.java中),您会看到“?”的数量是列表参数中的字符串数量。不使用转换器。实现逻辑可能是针对list argument in the WHERE clause 的情况。 -
@BobSnyder 谢谢!如果你明天能帮助我,我会很高兴。
标签: android sqlite android-studio android-sqlite android-room