如何使用2 for循环从ArrayList获取值

时间:2014-07-04 06:50:25

标签: android sqlite

这是我尝试将光标中的元素添加到 ArrayList 的类。

public ArrayList<String> getArrayList()
        {
            int i;
            sdb=this.getReadableDatabase();
            c=null;
            ArrayList<String> list=null;
            try{
            c=sdb.rawQuery("select * from Products", null);
            c.moveToFirst();
            if(c!=null)
            {
                list=new ArrayList<String>();
                do
                {
                    for(i=1;i<=c.getColumnCount();i++)
                    {
                        list.add(c.getString(c.getColumnIndex("ProductName")));
                        list.add(c.getString(c.getColumnIndex("ProduceType")));
                        list.add(c.getString(c.getColumnIndex("Company")));
                        list.add(c.getString(c.getColumnIndex("Price")));
                        list.add(c.getString(c.getColumnIndex("Quantity")));
                    }
                }while(c.moveToNext());     
            }
            else
                System.out.println("c null");
            }catch(Exception e)
            {
                e.printStackTrace();
                //c=null;
            }
            /*finally{
                if(c!=null && !c.isClosed())
                {
                    c.close();
                    c=null;                 
                }
                close();
            }*/
            return list;
        }

这是我尝试从 ArrayList 检索数据并将它们添加到expandablelistview的地方。我希望组视图中游标中每一行的第一列和子项中相应行的其余列图。

private void loadData(){

                db=new DatabaseHelper(this);
                //db.open();
                System.out.println("returned from db.open() in loadData");
                ArrayList<String> al=db.getArrayList();
                db.close();
                int count=al.size();
                int i,j;
                try{
                for(i=1;i<=count;i=i+5)
                        {
                            String pn=al.get(i);
                            for(j=i;j<=i+5;j++)
                            {
                                String inf=al.get(j);
                                addProduct(pn,inf);
                            }
                        }
                }catch(StackOverflowError e)
                {
                    e.printStackTrace();
                }

         }

据我所知,我的for循环出错.Logcat显示以下错误

07-04 02:44:14.747: E/CursorWindow(1881): Failed to read row 0, column -1 from a CursorWindow which has 3 rows, 5 columns.

请告诉我arraylist数据检索的正确用法。谢谢。

2 个答案:

答案 0 :(得分:2)

我建议采用这种方法,因为你使用的方法是一种不好的做法。

不使用List of String,而是使用名为ProductInfo的自定义对象(包括所有这些字符串),并添加和检索该列表中的数据。

public class ProductInfo{

    String productName, productType, company, price, quantity;
    //getter setter

}

// add data
    List<ProductInfo> productList = new ArrayList<ProductInfo>();
    Cursor c = null;
    do {
        for (int i = 1; i <= c.getColumnCount(); i++) {

            ProductInfo pInfo = new ProductInfo();

            pInfo.setProductName(c.getString(c
                    .getColumnIndex("ProductName")));
            pInfo.setProductType(c.getString(c
                    .getColumnIndex("ProduceType")));
            pInfo.setCompany(c.getString(c.getColumnIndex("Company")));
            pInfo.setPrice(c.getString(c.getColumnIndex("Price")));
            pInfo.setQuantity(c.getString(c.getColumnIndex("Quantity")));

            productList.add(pInfo);
        }
    } while (c.moveToNext());

// retrieve data

    for (int i = 0; i < productList.size(); i++) {

        System.out.println("Info of Product "+(i+1));
        ProductInfo pInfo = productList.get(i);
        System.out.println("Prod name: "+ pInfo.getProductName());
        System.out.println("Prod Type: "+pInfo.getProductType());
        System.out.println("Company: "+pInfo.getCompany());
        System.out.println("Price: "+pInfo.getPrice());
        System.out.println("Quantity: "+pInfo.getQuantity());

    }

答案 1 :(得分:0)

请尝试这种方式,希望这有助于您解决问题。

    public ArrayList<HashMap<String, String>> getArrayList() {
        int i;
        sdb = this.getReadableDatabase();
        c = null;
        ArrayList<HashMap<String, String>> list = null;
        try {
            c = sdb.rawQuery("select * from Products", null);
            c.moveToFirst();
            if (c != null) {
                list = new ArrayList<HashMap<String, String>>();
                do {
                    for (i = 1; i <= c.getColumnCount(); i++) {
                        HashMap<String, String> row = new HashMap<String, String>();
                        row.put("ProductName", c.getString(c.getColumnIndex("ProductName")));
                        row.put("ProduceType", c.getString(c.getColumnIndex("ProduceType")));
                        row.put("Company", c.getString(c.getColumnIndex("Company")));
                        row.put("Price", c.getString(c.getColumnIndex("Price")));
                        row.put("Quantity", c.getString(c.getColumnIndex("Quantity")));
                        list.add(row);
                    }
                } while (c.moveToNext());
            } else
                System.out.println("c null");
        } catch (Exception e) {
            e.printStackTrace();
            //c=null;
        }
            /*finally{
                if(c!=null && !c.isClosed())
                {
                    c.close();
                    c=null;
                }
                close();
            }*/
        return list;
    }

    private void loadData() {

        db = new DatabaseHelper(this);
        //db.open();
        System.out.println("returned from db.open() in loadData");
        ArrayList<HashMap<String, String>> al = db.getArrayList();
        db.close();
        int count = al.size();
        int i, j;
        try {
            for (HashMap<String, String> product : al) {
                System.out.println("ProductName: " + product.get("ProductName"));
                System.out.println("ProduceType: " + product.get("ProduceType"));
                System.out.println("Company: " + product.get("Company"));
                System.out.println("Price: " + product.get("Price"));
                System.out.println("Quantity: " + product.get("Quantity"));
            }
        } catch (StackOverflowError e) {
            e.printStackTrace();
        }

    }