我对 Android 和 stackoverflow 还是很陌生,这是我的第一个问题……我希望你能帮助我。

我必须在 sqlite db 的基础上创建一个应用程序,其中包含 id、category.... 和步骤等列。步骤列的最大值为 1 到 16,并命名为 step1 到 step16,但并非所有条目都填充了所有步骤。
所以例如第一条记录只有 step1 到 step6 填充了一些字符串值,第二条记录可能有 step1 到 step10 等等。
现在我试图找出实际上有一个值的最大步数......它总是崩溃

12-20 15:45:41.038: DEBUG/AndroidRuntime(1243): Shutting down VM
12-20 15:45:41.038: WARN/dalvikvm(1243): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
12-20 15:45:41.044: ERROR/AndroidRuntime(1243): FATAL EXCEPTION: main
12-20 15:45:41.044: ERROR/AndroidRuntime(1243): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lochmann.zaubertricks/de.lochmann.zaubertricks.TrickExplanation}: java.lang.NullPointerException: println needs a message

我已经尝试了很多东西,目前我被困在这里:
public int getMaxSteps(int id) {
    int step=1;
    String query="SELECT step"+Integer.toString(step)+" FROM "+DB_NAME+" WHERE _id="+id;
    Cursor myCursor = myDataBase.rawQuery(query,null);
    while(myCursor.moveToFirst()) {
        if (myCursor.getString(0)!=null) {
            step++;
        query="SELECT step"+Integer.toString(step)+" FROM "+DB_NAME+" WHERE _id="+id;
            myCursor = myDataBase.rawQuery(query,null);
        }
    }
    return step;
}

基本上我正在寻找名称为 step+x 的列,如果它存在并且不为空,我会增加 step 并重新开始。工作,但它不会停止在 myCursor.getString(0)!=null。我也放了 try catch 块,但无济于事。
任何建议,或任何其他方式来完成我正在寻找的东西?有可能我错过了一些基本原则......

所以记录可能看起来像:
ID Name Description Step1 Step2 Step3 Step4 Step5 Step6 Step7 ... Step16
1  Test Foo         test  test  test  test  test  test  -         -

在我们的例子中,getMaxSteps(1) 方法应该返回一个 6,因为这是最后一个有值的单元格。

日志谈论的未捕获异常可能是什么?

ps:我知道这是一个非常糟糕的数据库设计,它不是我的,我只需要使用它。

很长的第一篇文章,我希望你能帮助我:)

问候马丁

最佳答案

据我所知,当你对一个不存在的列进行查询时,你会得到一个数据库异常。但是,我不确定为什么您没有在日志中获得正确的堆栈转储。只要您对不存在的列进行查询,它就会抛出。这是你所期望的吗?

我会做的是做一个 select * 查询,然后查看返回的列。也许是这样的:

String query = "SELECT * FROM " + DB_NAME + " WHERE _id=" + id;
Cursor myCursor = myDataBase.rawQuery(query, null);
if (! myCursor.moveToFirst()) {
   // no results
   return 0;
}
for (int i = 1; i < 1000; i++) {
    int index = cursor.getColumnIndex("step" + i);
    if (index < 0) {
         return i - 1;
    }
}
throw new IllegalStateException("Something is wrong and we'll be careful");

这将使您免于进行更昂贵的多次查询。

关于java - 安卓、SQL : how to find out if existing column has a value?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8578582/

10-12 17:17