基于查询将SQLite数据展示至ListView 大学分数数据库技术问询
实现SQLite数据展示到ListView的完整方案
我来一步步帮你搞定这个需求,核心逻辑就是把数据库的查询结果和ListView的Adapter绑定起来,下面是具体的实现步骤:
1. 先创建数据模型类(University.java)
首先我们需要一个实体类来封装每一条大学数据,这样处理起来更直观,也方便后续Adapter调用:
public class University { private int univId; private String univName; private int score; public University(int univId, String univName, int score) { this.univId = univId; this.univName = univName; this.score = score; } // 提供Getter方法,Adapter需要获取这些字段值来展示 public int getUnivId() { return univId; } public String getUnivName() { return univName; } public int getScore() { return score; } }
2. 完善数据库操作类,添加查询方法
在你的UniversityFinderDB里补充一个获取所有大学数据的方法,同时完善必要的数据库初始化逻辑:
public class UniversityFinderDB extends SQLiteOpenHelper { // 你已有的常量定义 private static final int DATABASE_VERSION= 1; static final String DATABASE_NAME="universities.db"; private static final String TABLE_NAME="university"; private static final String COLUMN_UNIVID="univId"; private static final String COLUMN_UNIVERSITYNAME="univName"; private static final String COLUMN_SCORE="score"; // 补充构造方法 public UniversityFinderDB(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // 完善表创建逻辑(确保univId为主键,分数唯一) @Override public void onCreate(SQLiteDatabase db) { String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUMN_UNIVID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_UNIVERSITYNAME + " TEXT," + COLUMN_SCORE + " INTEGER UNIQUE" + ")"; db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } // 新增:获取所有大学数据的方法,返回封装好的对象列表 public List<University> getAllUniversities() { List<University> universityList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); // 按分数倒序查询(可根据需求调整排序规则) String query = "SELECT * FROM " + TABLE_NAME + " ORDER BY " + COLUMN_SCORE + " DESC"; Cursor cursor = db.rawQuery(query, null); // 遍历游标,把每行数据转换成University对象 if (cursor.moveToFirst()) { do { int univId = cursor.getInt(cursor.getColumnIndex(COLUMN_UNIVID)); String univName = cursor.getString(cursor.getColumnIndex(COLUMN_UNIVERSITYNAME)); int score = cursor.getInt(cursor.getColumnIndex(COLUMN_SCORE)); universityList.add(new University(univId, univName, score)); } while (cursor.moveToNext()); } // 记得关闭游标和数据库连接,避免内存泄漏 cursor.close(); db.close(); return universityList; } }
3. 创建自定义Adapter与列表项布局
为了在ListView里展示大学名称和分数,我们需要自定义Adapter来控制每一行的UI:
首先创建列表项布局文件list_item_university.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <TextView android:id="@+id/tv_univ_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold"/> <TextView android:id="@+id/tv_score" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:textColor="@android:color/darker_gray" android:layout_marginTop="4dp"/> </LinearLayout>
然后编写自定义Adapter类UniversityAdapter.java:
public class UniversityAdapter extends ArrayAdapter<University> { private Context mContext; private List<University> mUniversityList; public UniversityAdapter(Context context, List<University> universityList) { super(context, 0, universityList); mContext = context; mUniversityList = universityList; } @NonNull @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { // 复用convertView提升列表滚动性能 View listItem = convertView; if (listItem == null) { listItem = LayoutInflater.from(mContext).inflate(R.layout.list_item_university, parent, false); } // 获取当前位置的大学对象 University currentUniv = mUniversityList.get(position); // 设置大学名称和分数到对应控件 TextView tvUnivName = listItem.findViewById(R.id.tv_univ_name); tvUnivName.setText(currentUniv.getUnivName()); TextView tvScore = listItem.findViewById(R.id.tv_score); tvScore.setText("分数: " + currentUniv.getScore()); return listItem; } }
4. 在Activity中完成数据绑定
最后在你的Activity里初始化ListView,查询数据库并设置Adapter:
public class MainActivity extends AppCompatActivity { private ListView mListView; private UniversityFinderDB mDBHelper; private UniversityAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view_universities); mDBHelper = new UniversityFinderDB(this); // 查询所有大学数据 List<University> universityList = mDBHelper.getAllUniversities(); // 初始化Adapter并绑定到ListView mAdapter = new UniversityAdapter(this, universityList); mListView.setAdapter(mAdapter); // 可选:给ListView添加点击事件 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { University selectedUniv = universityList.get(position); Toast.makeText(MainActivity.this, selectedUniv.getUnivName() + ": " + selectedUniv.getScore(), Toast.LENGTH_SHORT).show(); } }); } @Override protected void onDestroy() { super.onDestroy(); // 关闭数据库连接,避免资源泄漏 mDBHelper.close(); } }
补充说明
- 如果数据库里还没有测试数据,可以在
UniversityFinderDB里添加插入数据的方法,先插入几条数据再运行。 - 如果你想直接操作Cursor而不转换为对象列表,可以使用
CursorAdapter,只需要在查询语句里把univId别名成_id(比如SELECT univId AS _id, univName, score FROM university),然后使用SimpleCursorAdapter或者自定义CursorAdapter即可。
内容的提问来源于stack exchange,提问作者Prathmesh Pardhiye
相关产品推荐
相关产品推荐

