我已经阅读了很多网站和教程,但都无法解决我的问题。我有一个应用程序可以工作,直到我尝试从我的数据库中读取(它打开它就好了)。我知道这不是正确的做事方式,但我有两个全局字符串,它们从我的主要 Activity 传递到我的 DataBaseHelper 类(DB_TABLE
和 spinnerPipeLengthText
)。当我调用以下代码行以从特定行的所有列中检索数据时,我的应用程序崩溃了。
Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null,
CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);
这是我完整的 getData
方法:
public Cursor getData() {
Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null,
CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);
if (cursorData != null)
cursorData.moveToFirst();
cursorData.moveToFirst();
CSSTPipeSizingActivity.textViewSize15.setText(cursorData.getString(1));
cursorData.moveToNext();
CSSTPipeSizingActivity.textViewSize19.setText(cursorData.getString(1));
cursorData.moveToFirst();
CSSTPipeSizingActivity.textViewSize25.setText(cursorData.getString(1));
cursorData.moveToNext();
CSSTPipeSizingActivity.textViewSize31.setText(cursorData.getString(1));
cursorData.moveToFirst();
CSSTPipeSizingActivity.textViewSize37.setText(cursorData.getString(1));
cursorData.moveToNext();
CSSTPipeSizingActivity.textViewSize46.setText(cursorData.getString(1));
cursorData.moveToNext();
CSSTPipeSizingActivity.textViewSize62.setText(cursorData.getString(1));
cursorData.close();
return cursorData;
} // end method getData
正如您从我的代码中看到的那样,我正在尝试获取数据并将其直接输入到 main.xml
文件中的 TextView 中。我不知道这是否可能,但这将由我稍后弄清楚。现在我需要获取数据。
这是我的日志:
03-12 19:23:33.587: D/AndroidRuntime(20191): Shutting down VM
03-12 19:23:33.587: W/dalvikvm(20191): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-12 19:23:33.617: E/AndroidRuntime(20191): FATAL EXCEPTION: main
03-12 19:23:33.617: E/AndroidRuntime(20191): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.skyesmechanical.CSSTPipeSizing/com.skyesmechanical.CSSTPipeSizing.CSSTPipeSizingActivity}: java.lang.NullPointerException
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.os.Looper.loop(Looper.java:123)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 19:23:33.617: E/AndroidRuntime(20191): at java.lang.reflect.Method.invokeNative(Native Method)
03-12 19:23:33.617: E/AndroidRuntime(20191): at java.lang.reflect.Method.invoke(Method.java:507)
03-12 19:23:33.617: E/AndroidRuntime(20191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 19:23:33.617: E/AndroidRuntime(20191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 19:23:33.617: E/AndroidRuntime(20191): at dalvik.system.NativeStart.main(Native Method)
03-12 19:23:33.617: E/AndroidRuntime(20191): Caused by: java.lang.NullPointerException
03-12 19:23:33.617: E/AndroidRuntime(20191): at com.skyesmechanical.CSSTPipeSizing.DataBaseHelper.getData(DataBaseHelper.java:173)
03-12 19:23:33.617: E/AndroidRuntime(20191): at com.skyesmechanical.CSSTPipeSizing.CSSTPipeSizingActivity.onCreate(CSSTPipeSizingActivity.java:105)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-12 19:23:33.617: E/AndroidRuntime(20191): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-12 19:23:33.617: E/AndroidRuntime(20191): ... 11 more
感谢您的帮助!
最佳答案
好吧,您正在关闭光标然后尝试将其返回...那样做不太好。要么关闭游标而不返回任何内容,要么返回游标。
当您执行 movetofirst、movetonext,然后再次 movetofirst 时,您还会继续迭代前几个条目。
我也相信您的 getString 需要一点帮助。
这是我的做法:
titleTxt.setText(eventedit.getString(eventedit
.getColumnIndexOrThrow(AttendanceDB.EVENT_NAME)));
titleTxt
是我之前设置的TextView引用。
eventEdit
是我想要从中获取信息的光标(以及之前创建的)
AttendanceDB
是我的数据库适配器类
EVENT_NAME
是我在我的数据库适配器类中设置的列名变量
编辑
好的,现在我重新阅读了您的问题,我意识到我回答了错误的部分。问题是您的查询搞砸了。我觉得应该更像这样:
Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null,
COLUMN_ID + "=" + CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);
您需要告诉查询要在哪个列中搜索您想要的信息 (CSSTPipeSizingActivity.spinnerPipeLengthText)。因此,将 COLUMN_ID 替换为您的列名或它的变量,您就可以开始了。
您真的应该查看信息 here ,特别是各种查询方法及其所需的参数。
关于android - 需要帮助读取 Android 的 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9676784/