问题描述
我的查询出于某种原因在DAO_Impl构建中显示语法错误.我尝试了重建,但是在执行以下查询时仍然出错:
My query is showing a syntax error in the DAO_Impl build for some reason. I tried a rebuild but it still errors when conducting the following query:
查询:
@Query("UPDATE TasksTable SET daysOfWeek = :days WHERE taskID = :tkID")
fun updateDays(tkID: Int, days: MutableList<Boolean>)
EntityTask:
EntityTask:
data class EntityTask(
var taskID: Int = 0,
var personID : Int = 0,
var name : String = "",
var frequency: Int = 1,
var interval: Int = 0,
var haveSchedule: Boolean = false,
var schedule: Int = 0,
var scheduleString: String = "",
var description: String = "",
var showProgressLayout: Boolean = true,
var daysOfWeek: MutableList<Boolean> = mutableListOf(),
var daysOfMonth: MutableList<Boolean> = mutableListOf(),
var currentScores: ScoresCurrent = ScoresCurrent(),
@Ignore
var scores : MutableList<EntityScore> = mutableListOf()
)
DaoTasks_Impl:
DaoTasks_Impl:
@Override
public void updateDays(int tkID, List<Boolean> days) {
StringBuilder _stringBuilder = StringUtil.newStringBuilder();
_stringBuilder.append("UPDATE TasksTable SET daysOfWeek = ");
final int _inputSize = days.size();
StringUtil.appendPlaceholders(_stringBuilder, _inputSize);
_stringBuilder.append(" WHERE taskID = ");
_stringBuilder.append("?");
final String _sql = _stringBuilder.toString();
SupportSQLiteStatement _stmt = __db.compileStatement(_sql); //This is line 330
错误消息:
03-01 07:05:37.504 26855-27552/com.samuelriesterer.taskprogress E/SQLiteLog: (1) near "?": syntax error
03-01 07:05:37.514 26855-27552/com.samuelriesterer.taskprogress E/AndroidRuntime: FATAL EXCEPTION: Thread-23439
Process: com.samuelriesterer.taskprogress, PID: 26855
android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: UPDATE TasksTable SET daysOfWeek = ?,?,?,?,?,?,? WHERE taskID = ?
#################################################################
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(near "?": syntax error (code 1): , while compiling: UPDATE TasksTable SET daysOfWeek = ?,?,?,?,?,?,? WHERE taskID = ?)
#################################################################
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1058)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:623)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1132)
at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.compileStatement(FrameworkSQLiteDatabase.java:64)
at android.arch.persistence.room.RoomDatabase.compileStatement(RoomDatabase.java:244)
at com.samuelriesterer.taskprogress.data.daos.DAOTasks_Impl.updateDays(DAOTasks_Impl.java:310)
at com.samuelriesterer.taskprogress.data.Data$Companion$editTask$thread$1.run(Data.kt:569)
at java.lang.Thread.run(Thread.java:818)
我为此有一个类型转换器,所以我不知道为什么它不会让我更新列表.我知道我的类型转换器可以工作,因为将列表添加到数据库时它可以工作. (它已添加到我的数据库中).在UPDATE查询中使用时,它只是不起作用.
I have a type converter for this so I don't know why it won't let me update a list. I know my type converter works because it works when adding the list to the database. (It is added to my database). It is just not working when used in an UPDATE query.
我的转换器:
@TypeConverter fun stringToListBoolean(value: String): MutableList<Boolean>
{
val list = mutableListOf<Boolean>()
value.forEach { c ->
if(c == 'F') list.add(false)
else list.add(true)
}
return list
}
@TypeConverter fun listBooleanToString(list: MutableList<Boolean>): String
{
var value = ""
for(i in list)
{
if(i) value += "T"
else value += "F"
}
return value
}
推荐答案
因此,根据Jeel Vankhede的建议,我将MutableList更改为ArrayList,并且UPDATE查询起作用了. Impl版本的区别:
So by the suggestion from Jeel Vankhede, I changed the MutableList to an ArrayList and the UPDATE query works. The difference in the Impl build :
MutableList:
MutableList:
@Override
public void test(int tkID, List<Boolean> test) {
StringBuilder _stringBuilder = StringUtil.newStringBuilder();
_stringBuilder.append("UPDATE TasksTable SET test = ");
final int _inputSize = test.size();
StringUtil.appendPlaceholders(_stringBuilder, _inputSize);
_stringBuilder.append(" WHERE taskID = ");
_stringBuilder.append("?");
final String _sql = _stringBuilder.toString();
SupportSQLiteStatement _stmt = __db.compileStatement(_sql);
ArrayList:
ArrayList:
@Override
public void test(int tkID, ArrayList<Boolean> test) {
final SupportSQLiteStatement _stmt = __preparedStmtOfTest.acquire();
__db.beginTransaction();
try {
int _argIndex = 1;
final String _tmp;
_tmp = Converters.listBooleanToString(test);
if (_tmp == null) {
_stmt.bindNull(_argIndex);
} else {
_stmt.bindString(_argIndex, _tmp);
}
_argIndex = 2;
_stmt.bindLong(_argIndex, tkID);
_stmt.executeUpdateDelete();
__db.setTransactionSuccessful();
} finally {
__db.endTransaction();
__preparedStmtOfTest.release(_stmt);
}
}
如您所见,ArrayList使用转换器,而MutableList不使用转换器.不确定为什么会这样吗?
As you can see, the ArrayList uses the converter while the MutableList does not. Not sure why this is??
这篇关于更新List< Boolean>时,TypeConverter不起作用.房间数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!