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

基于查询将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:57:30