【问题标题】:Need help reading from SQLite database for Android需要帮助读取 Android 的 SQLite 数据库
【发布时间】:2012-03-13 00:33:29
【问题描述】:

我已阅读了许多网站和教程,但无法解决我的问题。我有一个可以工作的应用程序,直到我尝试从我的数据库中读取(它打开它就好了)。我知道这不是正确的做事方式,但我有两个全局字符串从我的主要活动传递给我的 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 文件中的文本视图中。我不知道这是否可能,但这将由我以后弄清楚。现在我需要获取数据。

这是我的日志:

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

感谢您的帮助!

【问题讨论】:

    标签: android database sqlite cursor


    【解决方案1】:

    嗯,你正在关闭你的光标,然后试图返回它......那样不会工作得很好。要么关闭光标不返回任何内容,要么返回光标。

    当您执行 movetofirst、movetonext 和 movetofirst 时,您还会继续迭代前几个条目。

    我也相信您的 getString 需要一点帮助。

    我是这样处理的:

    titleTxt.setText(eventedit.getString(eventedit
        .getColumnIndexOrThrow(AttendanceDB.EVENT_NAME)));
    

    titleTxt 是我之前设置的 TextView 引用。
    eventEdit 是我想要从中获取信息的光标(并且是之前创建的)
    AttendanceDB 是我的数据库适配器类
    EVENT_NAME 是我在 DB 适配器类中设置的列名变量

    编辑

    好的,现在我重新阅读了您的问题,我意识到我回答错了部分。问题是你的查询搞砸了。我觉得应该更像这样:

    Cursor cursorData = myDataBase.query(CSSTPipeSizingActivity.DB_TABLE, null,  
        COLUMN_ID + "=" + CSSTPipeSizingActivity.spinnerPipeLengthText, null, null, null, null, null);                           
    

    您需要告诉查询要在哪一列中搜索您想要的信息 (CSSTPipeSizingActivity.spinnerPipeLengthText)。因此,将 COLUMN_ID 替换为您的列名或它的变量就可以了。

    您确实应该查看信息here,尤其是各种查询方法及其所需参数。

    【讨论】:

    • 如果我尝试切换返回并关闭,我会收到一个错误...movetofirst 和 movetonext 是我在复制和粘贴方面的错误。
    • 当然你会得到一个错误,return x 之后什么都没有发生(这很像 break)。关键是您需要返回光标,在这种情况下您不应该关闭它,或者您需要关闭它而不返回任何内容。我已经修改了我的答案,以展示我在我目前正在进行的项目中的表现。
    【解决方案2】:

    您可以从 logcat 中看到错误是第 173 行的 NullPointerException。如果代码中没有行号,很难确切知道在这种情况下问题出在哪里,但我猜第 173 行是 cursorData。不在 if 语句中的 moveToFirst()。

    考虑 cursorData 为空的情况 -

    您检查 cursorData 不为空,如果是这种情况,则调用 moveToFirst()。但是你在下一行调用 moveToFirst() ;无论 cursorData 是否为 null,都会发生这种情况。

    一个常见的设计模式是让 getData 简单地返回光标,并让调用方法来处理提取。这可能类似于:

    { ... 如果(光标数据!= null) cursorData.moveToFirst(); 返回游标数据; }

    我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      首先,认为您可以将所有使用 Cursor 的代码放在 IF 语句中:

          if (cursorData != null){
              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();
          }
      

      其次,你可以检查下面的代码 b/c 你移动到下两次:

      cursorData.moveToNext();        
      CSSTPipeSizingActivity.textViewSize46.setText(cursorData.getString(1));
      cursorData.moveToNext();        
      CSSTPipeSizingActivity.textViewSize62.setText(cursorData.getString(1));
      

      最后,为所有 setText 方法使用带有字符串转换的 setText:

      CSSTPipeSizingActivity.textViewSize15.setText("" + cursorData.getString(1));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多