Android Studio中SQLite数据显示到ListView方法及错误排查
排查SQLite数据显示到ListView的问题
咱先从你贴的DatabaseHelper.java片段和Android开发里常见的踩坑点入手,一步步揪出问题:
1. 先确认数据库查询逻辑是否靠谱
首先得保证从Item_Master表拿数据的代码没写错。比如你得在DatabaseHelper里写个查询方法,列名要和你定义的常量完全一致(别小看大小写,虽然SQLite不敏感,但代码里写错就拿不到数据):
public Cursor getAllItems() { SQLiteDatabase db = this.getReadableDatabase(); // 用你定义的常量当列名,避免拼写错误 return db.query(TABLE_NAME, new String[]{Item_name, wEight, MrP, BarcodE}, null, null, null, null, null); }
要是查询方法漏写了,或者列名拼错(比如把wEight写成weight),那Cursor里根本没数据,ListView自然是空的。
2. 检查CursorAdapter的核心配置
ListView显示数据库数据一般用SimpleCursorAdapter或自定义CursorAdapter,这里有两个必踩的坑:
- 必须有
_id主键列:CursorAdapter要求查询结果里必须包含_id列(SQLite的主键约定),如果你的Item_Master表没加这个,直接就失效了!赶紧检查表的创建语句:static final String COLUMN_ID = "_id"; // 创建表的SQL得包含主键: private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Item_name + " TEXT," + wEight + " REAL," + MrP + " REAL," + BarcodE + " TEXT)"; - 列名和布局控件要一一对应:用SimpleCursorAdapter的时候,传入的列数组和布局控件ID数组得完全匹配,比如:
要是这里对应错了,或者布局里根本没这些控件,数据也显示不出来。// 假设你的列表项布局里有这些控件ID String[] fromColumns = {Item_name, wEight, MrP, BarcodE}; int[] toViews = {R.id.tv_item_name, R.id.tv_weight, R.id.tv_mrp, R.id.tv_barcode}; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list_item_layout, cursor, fromColumns, toViews, 0); listView.setAdapter(adapter);
3. 先确认Cursor里到底有没有数据
拿到Cursor后,先打日志验证下,别光盯着ListView瞎看:
Cursor cursor = dbHelper.getAllItems(); if (cursor != null) { Log.d("DB_CHECK", "数据库里总共有" + cursor.getCount() + "条数据"); // 移动到第一条看看具体内容 if (cursor.moveToFirst()) { String firstItem = cursor.getString(cursor.getColumnIndex(Item_name)); Log.d("DB_CHECK", "第一条数据的名称:" + firstItem); } }
如果cursor.getCount()是0,那要么数据库里真没数据,要么你查错了表/列;如果有数据但ListView不显示,那肯定是Adapter的配置问题。
4. 检查ListView的初始化和Adapter设置
别犯低级错误:有没有在Activity/Fragment里正确找到ListView控件?有没有调用listView.setAdapter(adapter)?比如:
ListView listView = findViewById(R.id.your_list_view_id); // 先拿Cursor,再创建Adapter,最后设置给ListView Cursor cursor = dbHelper.getAllItems(); SimpleCursorAdapter adapter = ...; listView.setAdapter(adapter);
要是忘了调用setAdapter,ListView铁定是空的。
5. 数据库版本和表结构的坑
如果你之前修改过表结构,但没更新数据库版本号,新的表结构不会生效!检查DatabaseHelper的构造方法:
public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, 2); // 最后一个参数是版本号,改结构后要+1 }
还要在onUpgrade方法里处理表更新,比如删除旧表重新创建,不然旧表可能缺你需要的列:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); }
按这几步排查,基本就能找到问题啦~
内容的提问来源于stack exchange,提问作者Alpesh Savaliya
相关产品推荐
相关产品推荐

