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

Android Studio中AutoCompleteTextView读取本地SQLite数据库报错求助

问题排查与修复方案

核心错误原因

你在getNames()方法里调用db.rawQuery(table_name, null)是错误用法:rawQuery()要求传入完整的SQL查询语句,而非直接传入表名。SQLite会把drugstable当作SQL命令执行,因此触发语法错误。

修复步骤

1. 修正getNames()的查询逻辑

替换错误的查询语句,同时优化游标遍历逻辑,改用列名获取数据避免索引错误:

public ArrayList<String> getNames() {
    ArrayList<String> names = new ArrayList<>();
    // 确保操作的是预填充数据库而非空库
    if (db == null || !db.isOpen()) {
        try {
            openDataBase();
        } catch (SQLException e) {
            e.printStackTrace();
            return names;
        }
    }
    // 传入完整的SELECT查询语句
    Cursor cursor = db.rawQuery("SELECT " + column_name + " FROM " + table_name, null);
    // 正确遍历游标
    if (cursor.moveToFirst()) {
        do {
            int nameColumnIndex = cursor.getColumnIndex(column_name);
            if (nameColumnIndex != -1) {
                names.add(cursor.getString(nameColumnIndex));
            }
        } while (cursor.moveToNext());
    }
    cursor.close();
    return names;
}

2. 在MainActivity中完成数据库初始化

你当前未调用数据库的创建与打开方法,导致直接使用系统生成的空数据库,而非assets中的预填充库。修改onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
    dataBase = new DrugsDataBase(this);
    
    // 新增:创建并打开预填充数据库
    try {
        dataBase.createDataBase();
        dataBase.openDataBase();
    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }
    
    names = dataBase.getNames();

    ArrayAdapter<String> autoCompleteAdapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, names);
    autoCompleteTextView.setAdapter(autoCompleteAdapter);
}

3. 修复DrugsDataBase的onCreate方法

原方法中调用this.getReadableDatabase()会触发递归调用,直接清空该方法即可:

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    // 留空,预填充数据库无需创建表
}

额外注意事项

  • 确认assets文件夹下的aaa.db文件存在,且库内确实包含drugstable表与drug列。
  • 测试前卸载旧应用,避免残留的空数据库干扰结果。

内容的提问来源于stack exchange,提问作者Ahmed Amer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:53:15