使用 rawquery 的列表视图无法执行方法

List view with rawquery Could not execute method

我有一个小问题不知道如何解决。 我有一个从我的数据库中获取数据的游标,它看起来像这样:

public Cursor getAllData(){
    int id;
    SQLiteDatabase DB = this.getWritableDatabase();
    String dateTime = Helper.getCurrentDate();
    String date = dateTime.substring(0, 10);
    String date_to_look = date.substring(0, 10);
    String sql = "SELECT h.product_id, h.qty, h.date_time, p.product " +
            " FROM product_history h " +
            " LEFT JOIN products p ON (p.rowid = h.product_id) ";
    Cursor res = DB.rawQuery(sql, null);
    return res;
}

然后在我的 activity 上使用以下方法:

public void populateListView() {
      Cursor cursordata = myDb.getAllData();
      String productname = cursordata.getString(cursordata.getColumnIndex("product"));
       String [] products = {productname};    
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, products);
       ListView listviewman = (ListView)findViewById(R.id.listviewman);
       listviewman.setAdapter(adapter);

       }

用onclick执行:

public void shine(View v){
    Button shine = (Button)findViewById(R.id.shine);
    populateListView();
}

我做错了什么?

编辑: 仅显示 table 的最后一行。

public void populateListView() {
       Cursor cursordata = myDb.getAllData();

       if (cursordata.moveToFirst()) {
           do {
               String productname = cursordata.getString((cursordata.getColumnIndex("product")));
               String [] products = {productname};
               ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, products);
               ListView listviewman = (ListView)findViewById(R.id.listviewman);
               listviewman.setAdapter(adapter);

           } while (cursordata.moveToNext());
       }

Sahil 这是我使用的您建议的更新版本,它不起作用:

 public void populateListView() {
    Cursor cursordata = myDb.getAllData();
    List<String> li_records=new ArrayList<String>;

    if (cursordata.moveToFirst()) {
        do {
            String productname = cursordata.getString((cursordata.getColumnIndex("product")));
            String[] products = {productname};
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, products);
            ListView listviewman = (ListView) findViewById(R.id.listviewman);
            listviewman.setAdapter(adapter);
            li_records.add(productname);

        } while (cursordata.moveToNext());
    }
    String[] products=li_records.toArray();

}

尽量放

cursordata.moveToFirst()

之后
List<String> li_records=new ArrayList<String>;
Cursor cursordata = myDb.getAllData();

像这样使用 do while 循环,

    // looping through all rows and adding to list
    if (cursordata.moveToFirst()) {
        do {
           String productname = c.getString((c.getColumnIndex("product")));
           li_records.add(productname);
        } while (cursordata.moveToNext());
    }
String[] products=li_records.toArray();

在你的适配器中使用这个数组

试试这个它会工作正常:

public void populateListView() {
       Cursor cursordata = myDb.getAllData();
            ArrayList<String> products = new ArrayList<>();

       if (cursordata.moveToFirst()) {
           do {
               String productname = cursordata.getString((cursordata.getColumnIndex("product")));
               products.add(productname);

           } while (cursordata.moveToNext());
       }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, products);
               ListView listviewman = (ListView)findViewById(R.id.listviewman);
               listviewman.setAdapter(adapter);
  }