2011-12-20 6 views
3

私はAndroidとstackoverflowにかなり新しいです。これが私の最初の問題です...私があなたを助けてくれることを願っています。Android、SQL:既存の列に値があるかどうかを調べるにはどうすればよいですか?

id、category ....、stepsのような列を持つsqlite dbに基づいて、アプリケーションを作成する必要があります。ステップの列は1から16まであり、step1からstep16という名前ですが、すべての項目にすべてのステップが入っているわけではありません。 最初のレコードにはstep1〜step6のみがいくつかの文字列値で埋められ、2番目のレコードには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という名前の列を探しています。存在していて空でない場合は、ステップを増やしてもう一度開始します。動作しますが、myCursor.getString(0)!= nullでは停止しません。私も試しにキャッチブロックを置くが、役に立たない。 私が探していることを達成するための提案や他の方法はありますか?これは、との最後のセルであるとして

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:データベース設計が非常に悪いことは分かっていますが、それは私のものではありません。

かなり長い最初のポスト、私はあなたが私を助けることができると思います:)

挨拶マーティン

+0

を助けましたか?もしそうなら、それを受け入れてください。ありがとう。 – Gray

答えて

0

を多分mycursorクエリがバックnullステップ7の値として引っ張るとnullのですか?

+0

もし私が、 'getString(int)'が参照する基礎となるデータ構造が戻りデータが 'null 'のときに初期化されていることを確認するのであれば、 – James

+0

入力をありがとう。カーソルがnullでない場合、それはnullのcursor.getstring()です。質問に対する自分の返答を参照してください。 –

2

私が知る限り、存在しない列でクエリを実行すると、データベース例外が発生します。私はなぜあなたのログに適切なスタックダンプを取得していないかは分かりません。存在しない列でクエリを実行すると、すぐにスローされます。それはあなたの期待ですか?

私が行うことは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"); 

これは、はるかに高価な複数のクエリからあなたを保存します。

0

入力していただきありがとうございます。私は最終的に問題を解決することができました。予想より簡単でした。返された文字列がnullかどうかを確認するだけでした。

コード:私の答えはあなたを

public int getMaxSteps(int id) { 
    String query = "SELECT * FROM " + DB_NAME + " WHERE _id=" + id; 
    Cursor myCursor = myDataBase.rawQuery(query, null); 
    if (!myCursor.moveToFirst()) return -1; 
    for (int i = 1; i <16; i++) { 
     if (myCursor.getString(myCursor.getColumnIndex("step" + Integer.toString(i)))==null) { return i - 1; } 
    } 
    return 0; 
} 

おかげで再び、私はすぐにいくつかのより多くのアドバイスをする必要がありますかなり確信している:)