Android Room数据库创建报错:stmt.bindLong异常及SQL语法高亮错误
Room数据库创建报错:字段标红+stmt.bindLong绑定异常
问题描述
在Android Studio中创建Room数据库时出现以下问题:
- SQL查询语句中的
notes、title、id被标红,疑似语法错误 - 编译项目自动跳转到
MainDAO_Impl.java文件,报错提示stmt.bindLong(1, value.ID) - 已尝试修改查询语句、选择器、文件名,查阅SQL相关论坛仍未解决
相关代码
RoomDB类
package com.example.applicationnotes.DataBase; import android.content.Context; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import com.example.applicationnotes.Models.Notes; @Database(entities = Notes.class, version = 1, exportSchema = false) public abstract class RoomDB extends RoomDatabase { private static RoomDB database; private static String DATABASE_NAME = "NoteApp"; public synchronized static RoomDB getInstance(Context context){ if (database == null) { database = Room.databaseBuilder(context.getApplicationContext(), RoomDB.class, DATABASE_NAME) .allowMainThreadQueries() .fallbackToDestructiveMigration() .build(); } return database; } public abstract com.example.applicationnotes.DataBase.MainDAO mainDao(); }
MainDAO接口
package com.example.applicationnotes.DataBase; import static androidx.room.OnConflictStrategy.REPLACE; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; import java.util.List; import com.example.applicationnotes.Models.Notes; @Dao public interface MainDAO { @Insert (onConflict = REPLACE) void insert (Notes notes); @Query ("SELECT * FROM notes ORDER BY id DESC") List<Notes> getAll(); @Query("UPDATE notes SET title = :title, notes = :notes WHERE ID = :id") void update (int id, String title, String notes); @Delete void delete (Notes notes); @Query("UPDATE notes SET pinned = :pin WHERE ID = :id") void pin (int id, boolean pin); }
解决方案
1. 检查Notes实体类的映射配置
这是最可能的问题根源:
- 确保实体类上标注
@Entity(tableName = "notes"),与DAO中使用的表名完全一致 - 主键字段
id需标注@PrimaryKey(autoGenerate = true),且变量名必须是id(Room默认区分大小写,DAO的SQL中写的ID与实体类字段名不匹配会报错) - 确认实体类中存在
title、notes、pinned这三个字段,且变量名与SQL语句中的字段名完全匹配(若实体类字段名不同,需用@ColumnInfo(name = "xxx")指定映射关系)
2. 修正SQL语句中的字段大小写
将DAO中SQL语句的大写ID改为小写id,与实体类字段名统一:
@Query("UPDATE notes SET title = :title, notes = :notes WHERE id = :id") void update (int id, String title, String notes); @Query("UPDATE notes SET pinned = :pin WHERE id = :id") void pin (int id, boolean pin);
3. 清理重建项目
Room自动生成的MainDAO_Impl.java可能存在缓存问题,执行以下操作:
- 点击菜单栏
Build > Clean Project - 再点击
Build > Rebuild Project
内容的提问来源于stack exchange,提问作者Fenomentiy
相关产品推荐
相关产品推荐

