Java 带有Pragma table_info的空指针异常
在Android项目中,我们希望读取数据库的列信息。 我们找到了带有PRAGMA表信息的示例。 现在我们运行这个应用程序,它失败了,出现了一个NullPointerException,我们不知道为什么会发生这种情况。 这是我们代码的一部分Java 带有Pragma table_info的空指针异常,java,android,Java,Android,在Android项目中,我们希望读取数据库的列信息。 我们找到了带有PRAGMA表信息的示例。 现在我们运行这个应用程序,它失败了,出现了一个NullPointerException,我们不知道为什么会发生这种情况。 这是我们代码的一部分 public String[] getTableColumns(SQLiteDatabase db, String tableName) { Log.d("ArtDbHandler: ", "getTableColumns Start"
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调用该方法,tablename是在DBHandler类中定义的。
有什么想法吗
谢谢你的帮助。
T
日志:
以下是日志:
-
12-11 19:03:56.634:D/onCreate Main:(3325):onCreate 12-11
19:03:56.634:D/MediumDAO:(3325):MediumDAO开始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):致命异常:main 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):at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 12-11 19:03:56.664:E/AndroidRuntime(3325):at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 12-11 19:03:56.664:E/AndroidRuntime(3325):at
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):at
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):at
android.app.ActivityThread.main(ActivityThread.java:5041)12-11
19:03:56.664:E/AndroidRuntime(3325):在
java.lang.reflect.Method.Invokenactive(本机方法)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):at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 12-11 19:03:56.664:E/AndroidRuntime(3325):at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)12-11
19:03:56.664:E/AndroidRuntime(3325):在
dalvik.system.Nativestar.main(本地方法)12-11 19:03:56.664:
E/AndroidRuntime(3325):由以下原因引起:java.lang.NullPointerException
12-11 19:03:56.664:E/AndroidRuntime(3325):at
ArtDbHandler.getTableColumns(ArtDbHandler.java:182) 12-11 19:03:56.664:E/AndroidRuntime(3325):at
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):at
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):at
android.app.ActivityThread.performLaunchActivity(ActivityThre
ad.java:2144)问题是数据库的初始化。在我们进行查询时,数据库没有打开。
Thx Elltz和laalto需要帮助您也可以发布日志猫吗..好的,这是日志猫,在主帖子中,您如何初始化作为参数传递的
db
变量?getTableColumns中的第182行是什么?对不起,第182行是什么意思?使用此方法的返回值,我们希望构建一个class属性,该属性包含sqlite db中相应表的所有列。异常必须由以下行引发:db.rawQuery。在这之后我们没有得到日志。在此之后,带有curser.getString的行已关闭。
If (TABLE_INFO_PRAGMA_COLUMNNAME_INDEX != null) String columnName = cursor.getString(TABLE_INFO_PRAGMA_COLUMNNAME_INDEX);