我有一个应用程序在sqlite数据库中有一些措施。
从活动(电子邮件活动)中,用户选择将哪些数据发送到医生的电子邮件(最近1/7/30天的数据)。
这是此活动的代码:
import com.oikonomopo.blood.pressure.tracker.dao.BpDAO;
...
public class EmailActivity extends Activity implements OnItemSelectedListener {
Spinner spinner;
String[] measures = { "today", "7 days", "30 days" };
private Calendar theStart;
private Calendar theEnd;
SimpleDateFormat dateFormat;
String start;
String end;
//this refers to another class for the manipulate of my table
private BpDAO dao = null;
private Button sendEmailBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.email);
// ////////////////////////////////////
theEnd = Calendar.getInstance();
theStart = (Calendar) theEnd.clone();
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
// //////////////////////////////////
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
EmailActivity.this, android.R.layout.simple_spinner_item,
measures);
sendEmailBtn = (Button) findViewById(R.id.button1);
spinner = (Spinner) findViewById(R.id.spinner1);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
// BpDao - refers to my table - see later
dao = new BpDAO(this);
// add a click listener to the button
sendEmailBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
/////////////////////////////////////////////////////////////////////////////////////////
Log.d("BPT", "before"); // it works untill here
Cursor bpLastDaysList = dao.lastXdays_bp(start, end);
Log.d("BPT", "after"); //doesn't reach the code here!!
/////////////////////////////////////////////////////////////////////////////////////////
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
dao.close();
}
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
int position = spinner.getSelectedItemPosition();
switch (position) {
// last day
case 0:
theStart.add(Calendar.DAY_OF_MONTH, -1);
// date boundaries in TEXT format
start = dateFormat.format(theStart.getTime());
end = dateFormat.format(theEnd.getTime());
//
break;
// last 7 days
case 1:
theStart.add(Calendar.DAY_OF_MONTH, -7);
// date boundaries in TEXT format
start = dateFormat.format(theStart.getTime());
end = dateFormat.format(theEnd.getTime());
//
break;
// last 30 days
case 2:
theStart.add(Calendar.DAY_OF_MONTH, -30);
// date boundaries in TEXT format
start = dateFormat.format(theStart.getTime());
end = dateFormat.format(theEnd.getTime());
//
break;
}
}
}
但它给了我 logcat错误:
FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: near "09": syntax error: , while compiling: SELECT DISTINCT systolic, diastolic, datetime, _id, notes, pulses FROM bp_import WHERE datetime BETWEEN 2012-10-12 09:44 AND 2012-10-12 09:44 ORDER BY datetime DESC
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
...
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1405)
at com.oikonomopo.blood.pressure.tracker.dao.BpDAO.lastXdays_bp(BpDAO.java:76)
at com.oikonomopo.blood.pressure.tracker.EmailActivity$1.onClick(EmailActivity.java:70)
android.database.sqlite.SQLiteException:near“09”:语法错误:,同时编译:SELECT DISTINCT收缩,舒张,日期时间,_id,注释,脉冲FROM bp_import WHERE datetime BETWEEN 2012-10-12 09 :44和2012-10-12 09:44按日期时间DESC命令
BpDAO类的功能代码是:
public class BpDAO {
private DatabaseHelper_bp dbHelper;
private SQLiteDatabase database;
/**
* Movie table related constants.
*/
public final static String bp_TABLE = "bp_import";
public final static String bp_ID = "_id";
public final static String bp_DT = "datetime";
public final static String bp_SYS = "systolic";
public final static String bp_DIA = "diastolic";
public final static String bp_PUL = "pulses";
public final static String bp_NOT = "notes";
public BpDAO(Context context) {
dbHelper = new DatabaseHelper_bp(context);
database = dbHelper.getWritableDatabase();
}
/**
* \ Creates a new blood pressure measure
*
* @param datetime
* @param systolic
* @param diastolic
* @param pulses
* @param notes
* @return
*/
public long importBP(String datetime, String systolic, String diastolic,
String pulses, String notes) {
ContentValues values = new ContentValues();
values.put(bp_DT, datetime);
values.put(bp_SYS, systolic);
values.put(bp_DIA, diastolic);
values.put(bp_PUL, pulses);
values.put(bp_NOT, notes);
return database.insert(bp_TABLE, null, values);
}
// this is working perfect
/**
* Fetch all bps sorted DESCending
* @return
*/
public Cursor fetchAll_bp() {
Cursor mCursor = database.query(true, bp_TABLE, new String[] { bp_SYS,
bp_DIA, bp_DT, bp_ID, bp_NOT, bp_PUL }, null, null, null, null,
bp_DT + " DESC", null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
// here is the problem!
/**
* Fetch all bps sorted DESCending by date(yyyy-mm-dd hh:mm) of last
* X[1-7-30] days
* @return
*/
public Cursor lastXdays_bp(String start, String end) {
Cursor mCursor = database.query(true, bp_TABLE, new String[] { bp_SYS,
bp_DIA, bp_DT, bp_ID, bp_NOT, bp_PUL }, "datetime BETWEEN "
+ start + " AND " + end, null, null, null, bp_DT + " DESC",
null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
//
public void close() {
database.close();
}
}
DatabaseHelper_bp(扩展SQLiteOpenHelper)的代码是:
public class DatabaseHelper_bp extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "bpDB";
private static final int DATABASE_VERSION = 1;
// Database creation sql statement
private static final String DATABASE_CREATE = "create table bp_import ( _id integer primary key, datetime text not null, systolic text not null, diastolic text not null, pulses text not null, notes text not null);";
public DatabaseHelper_bp(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Method is called during creation of the database
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
}
// Method is called during an upgrade of the database,
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion,
int newVersion) {
Log.w(DatabaseHelper_bp.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
database.execSQL("DROP TABLE IF EXISTS bp_import");
onCreate(database);
}
}
我将日期时间保存为sqlite中的文本。 (2012-10-12 09:43)
答案 0 :(得分:2)
Cursor mCursor = database.query(true, bp_TABLE, new String[] { bp_SYS,
bp_DIA, bp_DT, bp_ID, bp_NOT, bp_PUL }, "datetime BETWEEN ?
AND ?" , new String[]{start,end}, null, null, bp_DT + " DESC",
null);
答案 1 :(得分:1)
日期字符串必须在SQL中用引号括起来 - 错误在您的BpDAO / lastXdays_bp(String start,String end)方法中。
而Sardor Dushamov的方法仍然更好