gpt4 book ai didi

java - Android 房间自定义更新 @Query 与字符串数组崩溃与 "sqlite syntax ? error"

转载 作者:太空狗 更新时间:2023-10-29 14:35:52 25 4
gpt4 key购买 nike

所以我在 @Query 中尝试更新包含 String[] 的列的 UPDATE 查询时遇到问题。

转换器:

@TypeConverter
public static String[] fromString(String value) {
Type listType = new TypeToken<String[]>() {
}.getType();
return new Gson().fromJson(value, listType);
}

@TypeConverter
public static String fromArrayList(String[] list) {
//Type listType = new TypeToken<String[]>() {
//}.getType();
Gson gson = new Gson();
String json = gson.toJson(list);
return json;
}

道:

@Dao
public interface CharacterDao {

@Insert(onConflict = OnConflictStrategy.IGNORE)
long[] insertCharacters(Character... characters);

@Query("UPDATE characters SET name = :name, episodes = :episodes, createdDate = :createdDate " +
"WHERE character_id = :character_id")
void updateCharacter(String character_id, String name, String[] episodes, String createdDate);
}

因此,为了更深入地解释我现在正在尝试在我的 Repository.class 中做的事情是在 insert 返回 -1 时 update 用户(因此存在冲突).我还为整个数据库添加了@TypeConverters,虽然我试图将它添加到 dao 和实体等,但它并没有解决问题。

因此,当使用正确的参数调用 characterDao.updateCharacter 时,就会出现问题。当我从方法调用和 @query 中删除 episodes 数组时,它工作得很好,所以 String[] 就是这里的问题。

但是,当我使用 @Update 而不是自定义 @Query 时,它工作得很好。但这仍然困扰着我,而且在任何地方都没有答案。

仅供引用,插入工作正常。问题仅在于更新

我得到的错误是“语法?错误”

追踪:

  --------- beginning of crash
2019-05-15 14:29:23.556 20853-21022/pl.com.bubka.characs E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: pl.com.bubka.characs, PID: 20853
android.database.sqlite.SQLiteException: near "?": syntax error (Sqlite code 1 SQLITE_ERROR): , while compiling: UPDATE characters SET name = ?, episodes = ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, createdDate = ? WHERE character_id = ?, (OS error - 0:Success)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:948)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:559)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:603)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:63)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1166)
at androidx.sqlite.db.framework.FrameworkSQLiteDatabase.compileStatement(FrameworkSQLiteDatabase.java:64)
at androidx.room.RoomDatabase.compileStatement(RoomDatabase.java:249)
at pl.com.bubka.characs.database.CharacterDao_Impl.updateCharacter(CharacterDao_Impl.java:465)
at pl.com.bubka.characs.repositories.CharactersRepository$1.saveCallResult(CharactersRepository.java:50)
at pl.com.bubka.characs.repositories.CharactersRepository$1.saveCallResult(CharactersRepository.java:39)
at pl.com.bubka.characs.utils.NetworkBoundResources$3$1.run(NetworkBoundResources.java:69)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:784)

最佳答案

像这样修改你的 DAO 文件:

@Dao
public interface CharacterDao {

@Insert(onConflict = OnConflictStrategy.IGNORE)
long[] insertCharacters(Character... characters);

@Update
void update(Character character);

/*By using above Annotation @Update()
Room Db automatically identifies Entity (in this case Character object)
from primary key and try to update changed Values for that id*/
}

用法:

Character character = new Character();
character.setId(character_id);// or whatever primary key (mandatory)
character.setName(name); // add all

character.set...(yourParams); //any other parameters to update
characterDao.update(character); // reference your character_dao

引用: Android Room Documentation

关于java - Android 房间自定义更新 @Query 与字符串数组崩溃与 "sqlite syntax ? error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com