我是 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/