2012-04-08 15 views
0

私のプログラムはオプションテーブル(ボリューム、振動など)を既に設定(挿入)している場合、オプションテーブルをチェックすることを想定しています。基本的に、オプションが設定されていない場合、テーブルの最初の列は0です。最初の行が空の場合は、デフォルトのオプションに切り替え、それ以外の場合はオプションの設定に切り替えます。私はトライキャッチで私のオプションチェッカーを囲むAN、このエラーが表示されます。私は私のコードは私のニーズに正しいかはわからないのでAndroid - カーソルインデックスの範囲外の例外

CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0.

は、私はまだ、このSQLものに初心者くさいですよ。私DBFunctionsに

options = new DBFunctions(this); 

    try{ 
    String row = "0".toString(); 
    long l = Long.parseLong(row); 
    options.open(); 
    String retId = options.getId(l); 
    int id = Integer.parseInt(retId); 
    options.close(); 
    //codes for setting the options if/if no data in option table exists will be put here 
    }catch(Exception e){ 
    String error = e.toString(); 
    tv.setText(error); 
}  

これは私のgetId(ある):

これはOnCreate関数での私のオプションチェッカー()です。 Javaの:あなたは(0行)は空であり、これはその例外をスローCursorからデータを取得しようとしている

public String getId(long l) { 

    String[] columns = new String[]{"id", "volume", "vibrate", "theme"}; 
    Cursor c = db.query(table, columns, "id=" + l, null, null, null, null); 
    if(c !=null){ 
     c.moveToFirst(); 
     String id = c.getString(1); 
     return id; 
    } 
    return null; 
} 

`

答えて

2

。あなたの他の質問がありましたが、optionsテーブルのid列がINTEGER PRIMARY KEY AUTOINCREMENTに設定されています。 AUTOINCREMENTは、データベースに行が挿入されるたびにこの列がその値を増やすことを意味し、0より大きい値で開始していると思います。つまり、getIdメソッドで行ったクエリは、空のCursorを返します(idの行をクエリしますが、データベースには何もありません)。

質問の最初の部分がデータベースに挿入されているか、データベースに挿入されておらず、デフォルトに切り替わっていないため、あなたが望むことをする方法がわかります。ここで

SharedPreferencesといくつかのサンプルコードは次のとおりです。私の他の質問にアップチェックする

// When you want to check the status of the options 
SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(this); //in an activity 
    // volumeStatus, vibrateStatus and themeStatus represent the current status of the options 
boolean volumeStatus = prefs.getBoolean("volume_key", false); // if volumeStatus is false it is the first app run or the user put the volume to off 
boolean vibrateStatus = prefs.getBoolean("vibrate_key", false); // the same as for volumestatus 
String themeStatus = prefs.getString("theme_key", null); // if themeStatus is null it is the first run of the app or the user didn't choose a theme 

    // when the user modifies one of the preferences use this 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putBoolean("volume_key", true); // the use sets the volume to on like in the database 
      editor.commit(); 
+0

おかげ.. :)私はすでに値を示すためのボタンを作成しようと、それが意味している、私は、入力されたすべてのデータを表示します私の挿入コードは正しいです。それから、私のバリューチェッカー(上記の私のコード)を試しましたが、それでもエラーが表示されます。私はまた、私が探している行(前は0)を1に変更しようとしましたが、まだエラーを表示しています.. –

+0

@PhilipSyあなたのデータをチェックし、あなたのデータベースに持っているIDを入れてクエリに使用します。問題は、あなたが何をやろうとしているのか分からないということです。ユーザーはデータベースに設定を挿入します(1つ、多くのものなど!)が、最初の行が空の場合(?!) !? – Luksprog

+0

"私はあなたの質問の最初の部分をデータベースに挿入されていない/挿入されていないことを理解していないし、デフォルトに切り替えるので、あなたが望むことをする方法を言うことができます。 - つまり、初めてアプリを使用すると、デフォルトオプション(Vibrations-On、Volume-Onなど)が設定されます。あなたのオプションを設定すると、前もって設定したかどうかがチェックされます。オプションテーブルに値があることが検出された場合はオプションを更新するだけで、値がなければ挿入されます。基本的には、私のオプションテーブルは1行だけでなければなりません。 –

関連する問題