[android.database.sqlite.SQLiteException:在“?”附近:语法错误(代码1):

问题描述 投票:0回答:1

我正在使用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自动生成的,而我对此没有任何影响...

android sqlite android-studio android-sqlite android-room
1个回答
0
投票

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); 
© www.soinside.com 2019 - 2024. All rights reserved.