mercredi 16 septembre 2015

Sqlite query for date range in android?

I'm facing a problem regarding performing a query that retrieves data from database for specific period of time. the idea of the code is that user chooses 2 different dates (from , to) and then a list view is populated through the data retrieved from a sqlite database, this data is between from and to dates. the query works perfect without WHERE clause but when i try the date range it fails.

I have dates stored in sqlite database file in this format M/d/yyyy 12:00:00 AM While i send the dates (parameters) to the SELECT statement in this format yyyy-MM-dd. I don't know a way to deal with this.

here is my code:-

    public class ProductionCommentsActivity extends Activity implements View.OnClickListener {
    private DBHandler dbHandler;
    private ListView listView;
    private Context context;
    private ArrayList<String> results = new ArrayList<String>();
    private ArrayAdapter adapter;
    private static String newline = System.getProperty("line.separator");
    private EditText editTextFrom, editTextTo;
    private DatePickerDialog datePickerDialogFrom, datePickerDialogTo;
    private SimpleDateFormat simpleDateFormat;
    private String fromDate,toDate ; // variables to store the chosen dates


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_production_comments);



        dbHandler = new DBHandler(this, dbHandler.DATABASE_NAME_PRODUCTION, null, 1);
        try {
            dbHandler.copyDataBase();
            Log.d("copydb", dbHandler.getDatabaseName());
        } catch (IOException e) {
            e.printStackTrace();
            Log.d("copydb",e.getMessage());
        }

        //defining list view
        listView = (ListView) findViewById(R.id.listView);

        //defining edit texts properties
        editTextFrom = (EditText) findViewById(R.id.editTextFrom);
        editTextFrom.setInputType(InputType.TYPE_NULL);
        editTextFrom.requestFocus();

        editTextTo = (EditText) findViewById(R.id.editTextTo);
        editTextTo.setInputType(InputType.TYPE_NULL);

        //setting up the date format
        simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
        setDateTimeField();
        context = this;
    }

    //method to handle the date pickers properties
    private void setDateTimeField() {
        editTextFrom.setOnClickListener((View.OnClickListener) ProductionCommentsActivity.this);
        editTextTo.setOnClickListener((View.OnClickListener) ProductionCommentsActivity.this);

        //creating a new instance of the calendar
        Calendar newCalendar = Calendar.getInstance();

        //creating a pop up date picker
        datePickerDialogFrom = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {

            //getting the chosen date and setting its format
            //and writing the chosen date in the edit text
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Calendar newDate = Calendar.getInstance();
                newDate.set(year, monthOfYear, dayOfMonth);
                editTextFrom.setText(simpleDateFormat.format(newDate.getTime()));
                fromDate = editTextFrom.getText().toString();
            }

        },newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH),
                newCalendar.get(Calendar.DAY_OF_MONTH));

        datePickerDialogTo = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                Calendar newDate = Calendar.getInstance();
                newDate.set(year, monthOfYear, dayOfMonth);
                editTextTo.setText(simpleDateFormat.format(newDate.getTime()));
                toDate = editTextTo.getText().toString();


            }

        },newCalendar.get(Calendar.YEAR), newCalendar.get(Calendar.MONTH),
                newCalendar.get(Calendar.DAY_OF_MONTH));
    }

    // on click method to handle which edit text was touched
    // and show the appropriate pop up calendar
    @Override
    public void onClick(View view) {
        if(view == editTextFrom) {
            datePickerDialogFrom.show();
        } else if(view == editTextTo) {
            datePickerDialogTo.show();
        }
    }

    public void searchDates(View view){
        setDateTimeField();
        try {
           // getProductionComments(fromDate, toDate);
            getProductionComments(fromDate,toDate);

            adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results);
            listView.setAdapter(adapter);
        }catch(Exception ex){
            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
        }


    }

    //get production comments data
    private void getProductionComments(String from, String to) {
        try {
            SQLiteDatabase db = dbHandler.getReadableDatabase();


            String query = "SELECT Date,Item,Comments FROM ProductionCommentData WHERE Date BETWEEN "+ from +
                    "AND "+ to+";";
            Cursor cursor = db.rawQuery(query,null);

            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    do {
                        String date = cursor.getString(cursor.getColumnIndex("Date"));
                        String item = cursor.getString(cursor.getColumnIndex("Item"));
                        String comments = cursor.getString(cursor.getColumnIndex("Comments"));

                        results.add("Date: " + date.substring(0, 9) + newline + newline  +
                                "Item: " + item + newline + newline  + "Comments: " + comments);
                    } while (cursor.moveToNext());
                }
            }
        } catch (SQLiteException se){
            Log.e(getClass().getSimpleName(), "Error retrieving data from database");
        }
    }

Aucun commentaire:

Enregistrer un commentaire