2012-05-10 6 views
0

私のデータベースからデータを取得しようとしています。 これはそれのために私のコードです:AndroidのSQLiteの奇妙なエラー?

}else if(menuItemName=="Toggle Reset Protection"){ 
    int is = updateData.getSingleProtect(listItemName, listTotal); 
    int val = 0; 
    if(is==0) 
    { 
     val = 1; 
    } 
    else 
     if(is==1) 
     { 
     val = 0; 
     } 
    updateData.protect(listItemName, listTotal, val); 
    onResume(); 
    } 

これは、コンテキストメニュー内にある、とにupdateDataは私のSQLiteのクラスを参照するオブジェクトです。 何らかの理由で、このelse if()コードブロックだけが私のプロジェクトを乱しています。

その存在は、エラーコンソールが、私はこのためupdateData.open()を行うカントと言われます:私は、コードの私のelse ifブロックを削除すると

close() was never explicitly called on database...... 

は、しかし、私はこのエラーを取得いけません。ここで何が間違っていますか?ここで

は私の完全なコンテキストメニューのコードです:

public boolean onContextItemSelected(MenuItem item) { 
AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
int menuItemIndex = item.getItemId(); 
String[] menuItems = new String[]{"Delete", "Edit", "Toggle Reset Protection", "Add"}; 
String menuItemName = menuItems[menuItemIndex]; 
final String listItemName = name[info.position]; 
final int listCurrent = current[info.position]; 
final int CurrentTarget = listCurrent+1; 
final int listTotal = total[info.position]; 
SetSql updateData = new SetSql(SpellCast.this); 
updateData.open(); 

if(menuItemName=="Delete"){ 
    updateData.delete(listItemName, listTotal); 
    onResume(); 
}else if(menuItemName=="Add"){ 
    if(listCurrent<listTotal){ 
    updateData.changeCurrent(CurrentTarget, listCurrent, listItemName); 
    onResume(); 
    } 
    }else if(menuItemName=="Edit"){ 
    AlertDialog.Builder alert = new AlertDialog.Builder(this); 
    alert.setTitle(listItemName); 
    alert.setMessage("Enter new maximum value:"); 
    final EditText input = new EditText(this); 
    alert.setView(input); 
    input.setText(Integer.toString(listTotal)); 
    input.setFilters(new InputFilter[] { 
      // Maximum 2 characters. 
      new InputFilter.LengthFilter(3), 
      // Digits only. 
      DigitsKeyListener.getInstance(), // Not strictly needed, IMHO. 
     }); 

     // Digits only & use numeric soft-keyboard. 
    input.setKeyListener(DigitsKeyListener.getInstance()); 
    alert.setPositiveButton("Change", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        String totalString = input.getText().toString(); 
        int totalv = Integer.parseInt(totalString); 
        changeTotal(totalv, listTotal, listItemName); 
        changeCurrent(totalv, listCurrent, listItemName); 
        onResume(); 
       } 
      }); 

    alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      // do nothing 
     } 
    }); 
    alert.show(); 
    }else if(menuItemName=="Toggle Reset Protection"){ 

    int is = updateData.getSingleProtect(listItemName, listTotal); 
    int val = 0; 

    if(is==0){ 
     val = 1; 
    }else if(is==1){ 
    val = 0; 
    } 
    updateData.protect(listItemName, listTotal, val); 
    onResume(); 
    } 
    updateData.close(); 
    return true; 
} 

そしてここでは、私のSQLクラスである:

あなたは私はわからない、誰に何をしていた人が見えたコード再フォーマット
private static class DbHelper extends SQLiteOpenHelper{ 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL("CREATE TABLE " + DATABASE_CASTING + " (" + 
       KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_NAME + " VARCHAR NOT NULL, " + 
       KEY_TOTAL + " INTEGER NOT NULL, " + 
       KEY_CURRENT + " INTEGER NOT NULL, " + 
       KEY_PROTECT + " INTEGER NOT NULL);" 
       ); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_CASTING); 
     onCreate(db); 
    } 


} 

public SetSql(Context c){ 
    ourContext = c; 
} 

public SetSql open(){ 
    ourHelper = new DbHelper(ourContext); 
    ourDatabase = ourHelper.getWritableDatabase(); 
    return this; 
} 

public void close(){ 
    ourHelper.close(); 
} 

public void createEntry(String name, int total, int protect) { 
    // TODO Auto-generated method stub 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME, name); 
    cv.put(KEY_TOTAL, total); 
    cv.put(KEY_CURRENT, total); 
    cv.put(KEY_PROTECT, protect); 
    ourDatabase.insert(DATABASE_CASTING, null, cv); 
} 
public void changeCurrent(int value, int cval, String name){ 
    ourDatabase.execSQL("UPDATE " + DATABASE_CASTING + " SET " + KEY_CURRENT + " = '" + value + "' WHERE " + KEY_NAME + " = '" + name + "' AND " + KEY_CURRENT + " = '" + cval + "'"); 
} 

public void changeTotal(int newtotal, int oldtotal, String name){ 
    ourDatabase.execSQL("UPDATE " + DATABASE_CASTING + " SET " + KEY_TOTAL + " = '" + newtotal + "' WHERE " + KEY_NAME + " = '" + name + "' AND " + KEY_TOTAL + " = '" + oldtotal + "'"); 
} 

public String[] getNames() throws SQLException{ 
    String[] columns = new String[]{KEY_NAME}; 
    Cursor c = ourDatabase.query(DATABASE_CASTING, columns, null, null, null, null, KEY_ROWID); 
    String[] result = new String[100]; 

    int iName = c.getColumnIndex(KEY_NAME); 
    //might cause errors here below... 
    int count = 0; 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     result[count] = c.getString(iName); 
     count++; 
    } 
    count = 0; 
    return result; 
} 

public int[] getTotal(){ 
    int[] totals = new int[100]; 
    String[] columns = new String[]{KEY_TOTAL}; 
    Cursor c = ourDatabase.query(DATABASE_CASTING, columns, null, null, null, null, KEY_ROWID); 
    int iTotal = c.getColumnIndex(KEY_TOTAL); 

    int count = 0; 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     totals[count] = c.getInt(iTotal); 
     count++; 
    } 
    count = 0; 
    return totals; 
} 
public int[] getCurrent(){ 
    int[] currents = new int[100]; 
    String[] columns = new String[]{KEY_CURRENT}; 
    Cursor c = ourDatabase.query(DATABASE_CASTING, columns, null, null, null, null, KEY_ROWID); 
    int iCurrent = c.getColumnIndex(KEY_CURRENT); 

    int count = 0; 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     currents[count] = c.getInt(iCurrent); 
     count++; 
    } 
    count = 0; 
    return currents; 
} 
public int enteries(){ 
    int num = 0; 
    String[] columns = new String[]{KEY_ROWID}; 
    Cursor c = ourDatabase.query(DATABASE_CASTING, columns, null, null, null, null, null); 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
     num++; 
    } 
    return num; 
} 

public void delete(String name, int total) { 
    // TODO Auto-generated method stub 
    ourDatabase.execSQL("DELETE FROM " + DATABASE_CASTING + " WHERE " + KEY_NAME + " = '" + name + "' AND " + KEY_TOTAL + " = '" + total + "'"); 
} 

public int[] getProtect(){ 
    int[] protect = new int[100]; 


    String q = "SELECT " + KEY_PROTECT + " FROM " + DATABASE_CASTING + " ORDER BY " + KEY_ROWID + ";"; 
    Cursor mCursor = ourDatabase.rawQuery(q, null); 

    int iProt = mCursor.getColumnIndex(KEY_PROTECT); 

    int count = 0; 
    for(mCursor.moveToFirst(); !mCursor.isAfterLast(); mCursor.moveToNext()){ 
     protect[count] = Integer.parseInt(mCursor.getString(iProt)); 
     count++; 
    } 
    count = 0; 

    return protect; 
} 

public void protect(String name, int total, int value){ 
    ourDatabase.execSQL("UPDATE " + DATABASE_CASTING + " SET " + KEY_PROTECT + " = '" + value + "' WHERE " + KEY_NAME + " = '" + name + "' AND " + KEY_TOTAL + " = '" + total + "';"); 
} 

public int getSingleProtect(String name, int total){ 
    String q = "SELECT * FROM " + DATABASE_CASTING + " WHERE " + KEY_NAME + " = '" + name +"' AND " + KEY_TOTAL + " = '" + total + "';"; 
    Cursor mCursor = ourDatabase.rawQuery(q, null); 

    int index = mCursor.getColumnIndex(KEY_PROTECT); 
    int prot = mCursor.getInt(index); 

    return prot; 
} 
} 
+0

updateData.open()とは何ですか? db.close()が呼び出されていないときにdbがSQLiteDatabaseであることについて一般的に話しています。 –

+0

updateData.open();データベースとdbHelperを開く関数です。 updateData.close();それらを閉じます。 – arielschon12

+0

「else if」が意味するものを教えてください。 (2つあります...) 'updateData.protect()'、 'getSingleProtect()'、 'onResume()'が何を意味するのかを、基本的に、すべての 'if'のケースで、完了後に明示的にデータベースを閉じることを確認してください... – WarrenFaith

答えて

0

エラーは私がこのようなことをしないからですが、違いがあります。

else 
    { 
     if(is==1) 
     { 
     val = 0; 
     } 
     updateData.protect(listItemName, listTotal, val); 
     onResume(); 
    } 

else 
     if(is==1) 
     { 
     val = 0; 
     } 
    updateData.protect(listItemName, listTotal, val); 
    onResume(); 

最初の第二にupdateDataコールすなわち、それは本当だ場合にのみ呼び出されます、else ifまたはいくつかの余分なブレースとせずに、かかわらず、呼び出されます。

あなたのコードをどのようにインデントするかを考えてみましょう。これは単なる可読性だけではありません。

+0

おっと、コピー貼りの中の何かが間違ってしまった、私のメインスレッドでもう一度見てください – arielschon12

+0

私はそれを修正しました!私のメインスレッドで見てください – arielschon12

+0

あなたのコードを再インデントする強力な必要性を感じていない、何かを見て、あなたがそれを修正したように見えることはできません。この固定をelseと理解していない場合。 if {} else {if {}}だから誰が私の選択であるかを見ることはできません。 –