在Android项目中我们想要读取数据库的列信息。 我们在PRAGMA表信息中找到了这些示例。 现在我们运行App并且它因nullpointerexcpetion而失败,我们不知道为什么会发生这种情况。 这是我们的准则的一部分。
public String[] getTableColumns(SQLiteDatabase db, String tableName)
{
Log.d("ArtDbHandler: ", "getTableColumns Start");
Cursor cursor = null;
cursor = db.rawQuery("PRAGMA table_info(" + tableName + ")", null);
Log.d("ArtDbHandler: ", "getTableColumns cnt:"+cursor.getCount());
String[] allColumns = new String[cursor.getCount()];
int i = 1;
while (!cursor.isAfterLast())
{
Log.d("ArtDbHandler: ", "getTableColumns i:"+i);
String columnName = cursor.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX);
Log.d("ArtDbHandler: ", "getTableColumns columnName:"+columnName);
allColumns[i] = columnName;
++i;
cursor.moveToNext();
}
cursor.close();
Log.d("ArtDbHandler: ", "getTableColumns Ende");
return allColumns;
}
在LogCat中,我们得到" getTableColumns开始"记录然后抛出异常。 我们使用sqlitedatabase对象和tablename来调用该方法,该表名在我们的DBHandler类中定义。 任何想法?
感谢4位帮助。 吨。
logcat的: 这是logcat:
12-11 19:03:56.634:D / onCreate Main:(3325):onCreate 12-11
19:03:56.634:D / MediumDAO:(3325):MediumDAO Start 12-11 19:03:56.644: D / MediumDAO:(3325):MediumDAO Ende 12-11 19:03:56.644:
D / ArtDbHandler:(3325):getTableColumns开始:中12-11 19:03:56.644:D / AndroidRuntime(3325):关闭VM 12-11
19:03:56.644:W / dalvikvm(3325):threadid = 1:线程退出与
未捕获的异常(组= 0x40a71930)12-11 19:03:56.664:
E / AndroidRuntime(3325):致命例外:主12-11 19:03:56.664:
E / AndroidRuntime(3325):java.lang.RuntimeException:无法启动
活动
ComponentInfo {com.example.artdb / com.example.artdb.ArtDbMainActivity}: java.lang.NullPointerException 12-11 19:03:56.664:
E / AndroidRuntime(3325):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 android.app.ActivityThread.access $ 600(ActivityThread.java:141)12-11
19:03:56.664:E / AndroidRuntime(3325):在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234)
12-11 19:03:56.664:E / AndroidRuntime(3325):在 android.os.Handler.dispatchMessage(Handler.java:99)12-11
19:03:56.664:E / AndroidRuntime(3325):在 android.os.Looper.loop(Looper.java:137)12-11 19:03:56.664:
E / AndroidRuntime(3325):在 android.app.ActivityThread.main(ActivityThread.java:5041)12-11
19:03:56.664:E / AndroidRuntime(3325):在 java.lang.reflect.Method.invokeNative(Native Method)12-11
19:03:56.664:E / AndroidRuntime(3325):在 java.lang.reflect.Method.invoke(Method.java:511)12-11 19:03:56.664:
E / AndroidRuntime(3325):在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)12-11
19:03:56.664:E / AndroidRuntime(3325):在 dalvik.system.NativeStart.main(Native Method)12-11 19:03:56.664:
E / AndroidRuntime(3325):引起:java.lang.NullPointerException
12-11 19:03:56.664:E / AndroidRuntime(3325):在 com.example.artdb.ArtDbHandler.getTableColumns(ArtDbHandler.java:182) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 com.example.artdb.MediumDAO.setColumns(MediumDAO.java:101)12-11
19:03:56.664:E / AndroidRuntime(3325):在 com.example.artdb.ArtDbMainActivity.onCreate(ArtDbMainActivity.java:20) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 android.app.Activity.performCreate(Activity.java:5104)12-11
19:03:56.664:E / AndroidRuntime(3325):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 12-11 19:03:56.664:E / AndroidRuntime(3325):在 android.app.ActivityThread.performLaunchActivity(ActivityThre
ad.java:2144)
答案 0 :(得分:0)
If (TABLE_INFO_PRAGMA_COLUMNNAME_INDEX != null) String columnName = cursor.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX);
答案 1 :(得分:0)
问题在于db的初始化。在我们进行查询时,数据库未打开。 Thx Elltz和laalto的帮助