You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:40:29