使用Cursor时的NullPointer

时间:2013-01-18 05:49:14

标签: android cursor nullpointerexception

我无法找到适合自己问题的标题。这是问题......在sysogetData()语句之后,它应该使用cMainTable中的语句打印游标中的值displayDataForMainTable()。但是,事实并非如此。没有例外和错误。我还保留了LogCat中的输出。有人可以帮我,为什么第一次打印后没有输出。

try {
    pm = new PortfolioManager(this);
    cMainTable = pm.getData("mainTable");
    if (cMainTable.equals(null)) {
        System.out.println("Null is returned");
    }
    displayDataForMainTable(cMainTable);
}
catch (Exception e) {
    System.out.println("problem at Oncreate Method");
}

getData()方法:

public Cursor getData(String string) {
    System.out.println("Getting Data for Table " + string);
    c = sqlDB.rawQuery("select * from " + string, null);      
    return c;
}

displayDataForMainTable()方法:

private void displayDataForMainTable(Cursor c2) {
    try {
        if (c2 != null) {
            if (c2.getCount() > 0) {
                c2.moveToFirst();
                do {
                    String SNo = c2.getString(c2.getColumnIndex("scriptnumber"));
                    String SName = c2.getString(c2.getColumnIndex("scriptname"));
                    int quant = Integer.parseInt(c2.getString(c2.getColumnIndex("totalquantity")));
                    double avg = Double.parseDouble(c2.getString(c2.getColumnIndex("averageprice")));
                    double cur = Double.parseDouble(c2.getString(c2.getColumnIndex("currentprice")));
                    double log = Double.parseDouble(c2.getString(c2.getColumnIndex("lossorgain")));
                    System.out.println("Inserted Values are ::: " + SNo
                            + " " + SName + " " + String.valueOf(quant)
                            + " " + String.valueOf(avg) + " "
                            + String.valueOf(cur) + " "
                            + String.valueOf(log));
                } while (c2.moveToNext());
            }
        } 
        else {
            System.out.println("Cursor c2 is Empty");
        }
    } catch (Exception e) {
        System.out.println("Exception in displayDataForMainTable");
    }
}

输出

01-18 11:02:27.523: D/dalvikvm(468): GC_EXTERNAL_ALLOC freed 47K, 53% free 2567K/5379K, external 2090K/2137K, paused 45ms
01-18 11:02:33.983: I/System.out(468): Getting Data for Table mainTable
01-18 11:02:36.584: W/KeyCharacterMap(468): No keyboard for id 0
01-18 11:02:36.584: W/KeyCharacterMap(468): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

编辑1 ::: 我按照Nasser的建议修改了getData(),但输出保持不变..

public Cursor getData(String string) {
    System.out.println("Getting Data for Table "+string);
    String table = string;
    sqlDB = getReadableDatabase();
    c = sqlDB.query(table, null, null, null, null, null, null);
    //c = sqlDB.rawQuery("select * from "+string, null);        
    return c;
}

在我阅读时,将null传递给列(第二个参数)将返回所有行。如果这是正确的,那么结果是一样的。

2 个答案:

答案 0 :(得分:0)

我认为你不应该从db返回游标而不是在它的对象中创建一个setterGetter类设置数据并返回该对象的数组..

这里的代码是相同的......试试..

还将日志放在那里,以便您了解正在发生的事情......

public ArrayList<ContactSetterGetter> getAllNumbers() {
    ArrayList<ContactSetterGetter> setterList = new ArrayList<ContactSetterGetter>();
    db = getWritableDatabase();
    Cursor c = db.query(C_TABLE_NAME, new String[] {"contact_number"},null, null, null, null, null);

    if (c.getCount() != 0) {
        c.moveToFirst();
        do {
            ContactSetterGetter setter = new ContactSetterGetter();
            setter.setContactNumber(c.getString(0));
            setterList.add(setter);
        } while (c.moveToNext());


    }else{
        c.close();
        db.close();
        return setterList;
    }
    c.close();
    db.close();
    return setterList;
    }

答案 1 :(得分:0)

似乎Eclipse已经向我展示了怜悯并且正在显示输出。争取4个多小时更改代码,冲浪,最后没有更改代码。

无论你作为一名程序员有多聪明,IDE都会让你觉得自己是新手。