0

I am trying to find the max number in a column of one of the tables in my database.

I thought I had this one sorted (I posted similar question previously), however after some testing I have realised my code isn't working as I thought.

The database consists of a table with the following columns:

_id, inspection_link, area_number, area_reference

I have created the following code in my database helper class:

public static final String AREAS_TABLE = "areas";
public static final String AREA_ID = "_id";
public static final String AREA_NUMBER = "area_number";
public static final String AREA_REF = "area_reference";
public static final String AREA_LINK = "area_link";
public static final String INSPECTION_LINK = "inspection_link";

public Cursor selectMaxAreaNumber (long inspectionId) {
    String inspectionIdString = String.valueOf(inspectionId);
    String[] tableColumns = new String[] { 
            AREA_NUMBER, 
            "(SELECT max(" + AREA_NUMBER + ") FROM " + AREAS_TABLE + ") AS max" 
        }; 
    String whereClause = INSPECTION_LINK + " = ?";
    String[] whereArgs = new String[] {
            inspectionIdString          
        };
    Cursor c = rmDb.query(AREAS_TABLE, tableColumns, whereClause, whereArgs, 
            null, null, null);


    if (c != null) {
        c.moveToFirst();
    }
    c.close();
    return c;
}

Then in the activity where I want to query the database I have written the following:

public class AreaEdit extends Activity {

private EditText AreaNumber;
private EditText AreaReference;
private Button saveButton;
private Button cancelButton;
protected boolean changesMade;
private AlertDialog unsavedChangesDialog;


private RMDbAdapter rmDbHelper;
private long inspectionId;
private long areaId;
private int nextAreaNumber = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    rmDbHelper = new RMDbAdapter(this);
    rmDbHelper.open();
    Intent i = getIntent();
    inspectionId = i.getLongExtra("Intent_InspectionID", -1);
    areaId = i.getLongExtra("Intent_AreaID", -1);
    if (areaId == -1) {
        Cursor c = rmDbHelper.selectMaxAreaNumber(inspectionId);
        startManagingCursor(c);
        c.moveToFirst();
        nextAreaNumber = c.getInt(c.getColumnIndex("max")) + 1; 
    }
    setContentView(R.layout.edit_area);
    setUpViews();
    populateFields();
    setTextChangedListeners();
}

private void setUpViews() {
    AreaNumber =(EditText)findViewById(R.id.area_number);
    AreaReference =(EditText)findViewById(R.id.area_reference);
    saveButton = (Button)findViewById(R.id.area_save_button);
    cancelButton = (Button)findViewById(R.id.area_cancel_button);


}

  private void populateFields() {
        if (areaId > 0) {
            Cursor c = rmDbHelper.fetchArea(areaId);
            startManagingCursor(c);
            c.moveToFirst();
            AreaNumber.setText(c.getString(
                    c.getColumnIndexOrThrow(RMDbAdapter.AREA_NUMBER)));
            AreaReference.setText(c.getString(
                    c.getColumnIndexOrThrow(RMDbAdapter.AREA_REF)));
            c.close();
        }
        else {
            AreaNumber.setText(String.valueOf(nextAreaNumber));
        }
    }

However, when it returns the wrong number - it seems to pick up the maximum number from the whole table which includes data from other inspections.

I guess this may be down to the conversion between Strings and Longs etc maybe, but I have a brickwall with this?

Any help much appreciated.

4

2 に答える 2

0

以下で簡単に試すことができます:

String sql = "SELECT MAX(ColumnNameHere) AS MaxValue FROM myTable WHERE AnotherColumn = 'SomValue'";
Cursor c = db.rawQuery(sql, null); 
c.moveToFirst();
c.getInt(c.getColumnIndex("MaxValue"));
于 2012-09-19T16:46:57.600 に答える
0

この質問の詳細な解決策は次のとおりです。

次の投稿で詳しく説明されているこれに対する解決策: SELECT statement not return MAX number

基本的には、クエリとカーソルの使い方の問題でした。

于 2012-09-21T09:07:42.910 に答える