android - 需要帮助读取 Android 的 SQLite 数据库

标签 android database sqlite android-cursor

我已经阅读了很多网站和教程,但都无法解决我的问题。我有一个应用程序可以工作,直到我尝试从我的数据库中读取(它打开它就好了)。我知道这不是正确的做事方式,但我有两个全局字符串,它们从我的主要 Activity 传递到我的 DataBaseHelper 类(DB_TABLEspinnerPipeLengthText)。当我调用以下代码行以从特定行的所有列中检索数据时,我的应用程序崩溃了。

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/

相关文章:

sql - 在关系数据库中存储分层数据有哪些选项?

java - 无法插入带有外键的记录(android sqlite)

c# - SQLite.Net-PCL 连接找不到数据库

java - 安卓数据验证

android - 媒体播放器无法在 Android API 28 上播放 mp3

php - 使用 PHP/mySQL 的 Google map

database - ERD 行动可以或应该涉及 2 个以上的实体吗?

php - 在 Android 上注册并使用 PHP、MySQL 和 SQLite 保存在数据库中

android - 需要一个使用 MonoDroid 和 MVVMCross 拍照的例子

android - 如何将android sdk添加回eclipse?