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
相关产品推荐
相关产品推荐

