【问题标题】:NullPointer while using Cursor使用光标时的 NullPointer
【发布时间】:2013-01-18 16:16:26
【问题描述】:

我找不到适合我的问题的标题。这就是问题所在......在syso'ing getData() 中的语句之后,它应该使用displayDataForMainTable() 中的语句打印游标中的值cMainTable。但是,事实并非如此。没有例外和错误。我还保留了我在 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 传递给列(第二个参数)将返回所有行。如果这是正确的,那么结果是一样的。

【问题讨论】:

  • 好像你得到了一个Cursor 回来,里面没有数据。检查你的mainTable中是否有一些记录。
  • @Henry,问题是我的系统中没有 Firefox。只有IE。有没有其他方法可以检查值。
  • @Nasser 我将如何使用 query() 编写选择语句。你能给我语法吗?
  • @VamsiChalla 您可以使用安装在 android 模拟器中的 sqlite3 工具 sqlite.org/sqlite.html 检查数据库。

标签: android cursor nullpointerexception


【解决方案1】:

我认为你不应该从 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;
    }

【讨论】:

  • 好的,但是 rawQuery 总是运行良好。为什么现在不工作了?
  • 如果你想使用 rawQuery 你可以使用,我只是想告诉你你必须返回 ArrayList 而不是 cursor,这让你有机会检查 db 中发生了什么。
【解决方案2】:

似乎 Eclipse 对我仁慈并正在显示输出。打了4个多小时改代码,冲浪,最后还是没改代码。

无论您作为编码员多么聪明,IDE 总是让您觉得自己是新手。

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多