java - 安卓,SQL : how to find out if existing column has a value?

标签 java android sql

我是 Android 和 stackoverflow 的新手,这是我的第一个问题...希望您能帮助我。

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

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 block ,但无济于事。 任何建议或任何其他方式来完成我正在寻找的东西?我很可能错过了一些基本原则......

所以记录可能是这样的:

ID Name Description Step1 Step2 Step3 Step4 Step5 Step6 Step7 ... Step16
1  Test Foo         test  test  test  test  test  test  -         -      

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

日志中提到的未捕获异常可能是什么?

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

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

问候马丁

最佳答案

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

我要做的是执行一个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/

相关文章:

SQL 查询 row_number() over partition by query result 在某些情况下返回错误

Android,为什么一个 Fragment 不能直接调用另一个?

sql - 如何尝试删除记录而不因错误而终止

java - 类转换异常 : ArrayList cannot be cast to

java - JPA 2 持久性上下文规范

java - Android 应用程序无法运行、崩溃

android - APK扩展名(OBB文件)和应用程序包之间的区别

php - 为什么 SQL SELECT 语句不检索 PHP 日历的相关日期?

java - Java + Oracle 中的 SQL 查询

java - 屏幕截图例程使用 LibGdx 给出空白图像