Android 游标 NPE dumpCursorToString returns 值
Android Cursor NPE dumpCursorToString returns values
正如标题所说,我遇到了 NullPointerException
,它出现在以下方法的第一个 getString()
处。为了进行调试,我使用 DatabaseUtils.dumpCursorToString()
查看游标,游标内有值,但在 if
语句和 do
语句之间,有些东西发生了变化。我在单独的 activity 中的另一种方法中使用了相同的代码,它完美地工作。
public ArrayList<String> getMusic() {
helper = new DbHelper(context);
db = helper.getReadableDatabase();
String[] cols = new String[]{MUSIC_ID, MUSIC_COUNTRY, MUSIC_BLUES, MUSIC_ROCK, MUSIC_METAL,
MUSIC_HIPHOP, MUSIC_CLASSICAL, MUSIC_PUNK, MUSIC_TECHNO, MUSIC_JAZZ, MUSIC_OTHER};
Cursor c = db.query(TABLE_MUSIC_INT, cols, null, null, null, null, null);
int count = c.getCount();
Log.v("INTEREST CURSOR ", "Count: " + count); // log row count
if (c.moveToFirst()) {
Log.v("INTEREST CURSOR ", DatabaseUtils.dumpCursorToString(c)); // dump cursor values
do {
musicInt.add(c.getString(0));
musicInt.add(c.getString(1));
musicInt.add(c.getString(2));
musicInt.add(c.getString(3));
musicInt.add(c.getString(4));
musicInt.add(c.getString(5));
musicInt.add(c.getString(6));
musicInt.add(c.getString(7));
musicInt.add(c.getString(8));
musicInt.add(c.getString(9));
musicInt.add(c.getString(10));
} while (c.moveToNext());
} else {
Log.e("DB_GET_DATA ", " DB_GET_DATA == null");
}
c.close();
return musicInt;
}
DatabaseUtils.dumpCursorToString(c) 输出:
01-15 19:57:01.201 6247-6247/us.enyi.enyi D/DB OPEN READ: Successful
01-15 19:57:20.440 6247-6247/us.enyi.enyi V/INTEREST CURSOR: Count: 1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@2f32900f
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: 0 {
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: _id=1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: country=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: blues=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: rock=Rock
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: metal=Metal
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: hiphop=HipHop
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: classical=Classical
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: punk=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: techno=Techno
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: jazz=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: musicother=Other
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: }
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: <<<<<
我尝试了其他方法从游标中检索数据,并在 SO 和 Android 文档中阅读了无数线程,但没有找到任何有用的解决方案。我不太明白为什么游标显然有值但 c.getString()
在 NPE 上失败。如有任何帮助,我们将不胜感激。
解决方法:
未能初始化 musicInt 导致 Cursor 无处放置它收集的数据。将 musicInt 声明为:
ArrayList<String> musicInt;
而不是:
ArrayList<String> musicInt = new ArrayList<>();
教训是确保正确初始化变量。你会像我一样拔头发。
我没看到你在哪里声明(或初始化)musicInt
。这可能就是导致您的 NPE 的原因。
正如标题所说,我遇到了 NullPointerException
,它出现在以下方法的第一个 getString()
处。为了进行调试,我使用 DatabaseUtils.dumpCursorToString()
查看游标,游标内有值,但在 if
语句和 do
语句之间,有些东西发生了变化。我在单独的 activity 中的另一种方法中使用了相同的代码,它完美地工作。
public ArrayList<String> getMusic() {
helper = new DbHelper(context);
db = helper.getReadableDatabase();
String[] cols = new String[]{MUSIC_ID, MUSIC_COUNTRY, MUSIC_BLUES, MUSIC_ROCK, MUSIC_METAL,
MUSIC_HIPHOP, MUSIC_CLASSICAL, MUSIC_PUNK, MUSIC_TECHNO, MUSIC_JAZZ, MUSIC_OTHER};
Cursor c = db.query(TABLE_MUSIC_INT, cols, null, null, null, null, null);
int count = c.getCount();
Log.v("INTEREST CURSOR ", "Count: " + count); // log row count
if (c.moveToFirst()) {
Log.v("INTEREST CURSOR ", DatabaseUtils.dumpCursorToString(c)); // dump cursor values
do {
musicInt.add(c.getString(0));
musicInt.add(c.getString(1));
musicInt.add(c.getString(2));
musicInt.add(c.getString(3));
musicInt.add(c.getString(4));
musicInt.add(c.getString(5));
musicInt.add(c.getString(6));
musicInt.add(c.getString(7));
musicInt.add(c.getString(8));
musicInt.add(c.getString(9));
musicInt.add(c.getString(10));
} while (c.moveToNext());
} else {
Log.e("DB_GET_DATA ", " DB_GET_DATA == null");
}
c.close();
return musicInt;
}
DatabaseUtils.dumpCursorToString(c) 输出:
01-15 19:57:01.201 6247-6247/us.enyi.enyi D/DB OPEN READ: Successful
01-15 19:57:20.440 6247-6247/us.enyi.enyi V/INTEREST CURSOR: Count: 1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@2f32900f
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: 0 {
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: _id=1
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: country=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: blues=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: rock=Rock
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: metal=Metal
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: hiphop=HipHop
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: classical=Classical
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: punk=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: techno=Techno
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: jazz=null
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: musicother=Other
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: }
01-15 19:57:27.897 6247-6247/us.enyi.enyi V/INTEREST CURSOR: <<<<<
我尝试了其他方法从游标中检索数据,并在 SO 和 Android 文档中阅读了无数线程,但没有找到任何有用的解决方案。我不太明白为什么游标显然有值但 c.getString()
在 NPE 上失败。如有任何帮助,我们将不胜感激。
解决方法:
未能初始化 musicInt 导致 Cursor 无处放置它收集的数据。将 musicInt 声明为:
ArrayList<String> musicInt;
而不是:
ArrayList<String> musicInt = new ArrayList<>();
教训是确保正确初始化变量。你会像我一样拔头发。
我没看到你在哪里声明(或初始化)musicInt
。这可能就是导致您的 NPE 的原因。