0

我正在尝试从我的数据库中获取一些数据。这是我的代码:

}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()因为:

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

但是当我删除我else if的代码块时,我没有收到这个错误。这里有什么问题?

这是我的完整上下文菜单代码:

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;
}
}
4

1 回答 1

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或带有一些额外的大括号,只有在它为真时才被调用。

考虑一下如何缩进代码,这不仅仅是可读性。

于 2012-05-10T10:51:43.840 回答