📜  在listview中从android中的数据库中获取数据 (1)

📅  最后修改于: 2023-12-03 15:23:25.047000             🧑  作者: Mango

在ListView中从Android中的数据库中获取数据

在Android应用程序中使用ListView来显示数据是非常常见的。另一方面,使用SQLite数据库来存储和检索数据也是非常常见的。在这篇文章中,我们将介绍如何在ListView中使用SQLite数据库来获取数据。

准备工作

在开始之前,让我们确保您具备以下先决条件:

  1. 已经熟悉Android开发,并且熟悉SQLite数据库。
  2. 已经创建了一个Android应用程序,并且已经为其添加了ListView
  3. 已经创建了一个SQLite数据库,并且已经在其中添加了数据。
获取数据

要在ListView中读取SQLite数据库中的数据,我们需要创建一个数据适配器。数据适配器是将数据从数据库读取,并将其传递到ListView以供显示的桥梁。

以下是一个示例DatabaseHelper类,它将从SQLite数据库中检索数据:

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "MyDatabase.db";

    private static final String TABLE_NAME = "MyTable";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_ADDRESS = "address";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
                + COLUMN_ID + " INTEGER PRIMARY KEY,"
                + COLUMN_NAME + " TEXT,"
                + COLUMN_ADDRESS + " TEXT" + ")";
        db.execSQL(CREATE_TABLE);

        String INSERT_DATA = "INSERT INTO " + TABLE_NAME + "(" + COLUMN_NAME + "," + COLUMN_ADDRESS + ") VALUES ('John', '123 Main St')";
        db.execSQL(INSERT_DATA);

        INSERT_DATA = "INSERT INTO " + TABLE_NAME + "(" + COLUMN_NAME + "," + COLUMN_ADDRESS + ") VALUES ('Jane', '456 Elm St')";
        db.execSQL(INSERT_DATA);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }

    public ArrayList<MyData> getData() {
        ArrayList<MyData> dataList = new ArrayList<>();

        String SELECT_ALL_DATA = "SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery(SELECT_ALL_DATA, null);

        if (cursor.moveToFirst()) {
            do {
                MyData myData = new MyData();
                myData.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
                myData.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME)));
                myData.setAddress(cursor.getString(cursor.getColumnIndex(COLUMN_ADDRESS)));
                dataList.add(myData);
            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();

        return dataList;
    }
}

该类具有一个getData()方法,该方法检索SQLite数据库中的所有数据并返回一个ArrayList对象。请注意,getData()方法返回的是自定义MyData对象列表。您可以根据需要定义自己的数据类。

创建适配器

一旦我们有了数据,我们需要创建一个适配器以传递这些数据给ListView。以下是一个示例适配器类:

public class MyAdapter extends BaseAdapter {

    private ArrayList<MyData> mDataList = new ArrayList<>();
    private Context mContext;

    public MyAdapter(Context context, ArrayList<MyData> dataList) {
        mContext = context;
        mDataList = dataList;
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return mDataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
        }

        TextView nameTextView = convertView.findViewById(R.id.nameTextView);
        TextView addressTextView = convertView.findViewById(R.id.addressTextView);

        MyData data = mDataList.get(position);
        nameTextView.setText(data.getName());
        addressTextView.setText(data.getAddress());

        return convertView;
    }
}

上述适配器使用我们之前创建的MyData类,该类存储了SQLite数据库中的数据。在适配器中,我们使用getView()方法来呈现每个列表项。我们使用LayoutInflater从布局文件中创建一个新的View对象,并将数据填充到该视图中。getItem()方法返回与position相对应的MyData对象。

在Activity中使用适配器

现在我们已准备好从SQLite数据库中检索数据并创建适配器。现在,我们来看一下如何在ListView中使用它们。

在您的Activity类中,您需要使用getData()方法来获取数据。然后,将该数据传递给MyAdapter类以创建适配器。最后,将适配器设置为ListView的适配器。

public class MainActivity extends AppCompatActivity {

    private ListView mListView;
    private DatabaseHelper mDatabaseHelper;
    private MyAdapter mAdapter;

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

        mListView = findViewById(R.id.listView);
        mDatabaseHelper = new DatabaseHelper(this);
        ArrayList<MyData> dataList = mDatabaseHelper.getData();
        mAdapter = new MyAdapter(this, dataList);
        mListView.setAdapter(mAdapter);
    }
}
总结

在本文中,我们介绍了如何从SQLite数据库中检索数据并将其显示在ListView中。我们使用了自定义适配器来传递数据,并使用自定义数据类来表示每个数据库条目。虽然上述代码仅提供了一个基本框架,但这是一个很好的起点,您可以在此基础上构建更复杂的应用程序。