我有4列int id |的数据库字符串数据|字符串日期| int boot,我有一些数据。当我使用字符串为id或数据调用它时,我有方法getRow(String s),并将查询更改为该选项,但是当我试图获得具有相同日期的行时,它将不会传递cursor.moveToFirst条件。
这是我的代码:
String CREATE_TABLE = "CREATE TABLE "
+ TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_DATA
+ " TEXT," + COLUMN_DATE + " TEXT," + COLUMN_BOOT + " Integer" + ")";
public String getRowID(String id){
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where " + COLUMN_ID + " = " + id, null);
if (c != null && c.moveToFirst()) {
//loggin succes
return "string";
}else return null;
}
public String getRowDate(String date){
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = " + date, null);
if (c != null && c.moveToFirst()) {
//loggin succes
return "string";
}else return null;
}
myDb.getRowID("1"); returning something
myDb.getRowDate("02122016"); returning null
我的数据库中有两行。
1 | 0.19 | 01122016 | 0
2 | 0.19 | 02122016 | 0
答案 0 :(得分:2)
比较整数和字符串时要小心。你可能想知道为什么SQLite会比较整数,因为你的参数是字符串,直到你认为你的原始查询看起来像这样:
select * from TABLE where DATE = 02122016
该值被解释为整数并转换为文本,但它在过程中丢失了前导零。您可以使用sqlite3 shell验证这一点:
sqlite> select 02122016;
2122016
sqlite> select '02122016' = 02122016;
0 -- false
sqlite> select cast(02122016 as text);
2122016
最简单的解决方法是使用DatabaseUtils
中的方法引用值:
String escaped = DatabaseUtils.sqlEscapeString(date);
String query = "select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = " + escaped;
更好的解决方法是使用占位符参数。请注意,Android将所有参数绑定为字符串:
String query = "select * from " + TABLE_NAME + " where " + COLUMN_DATE + " = ?";
db.rawQuery(query, new String[]{date});
但是,我的建议是不使用rawQuery()
,而是使用其中一种真正的query()
方法。 Here's a good example
最后,也许您应该考虑使用不同的格式来存储日期。在实践中,我通常要么存储带有unix时间戳的INTEGER列(自纪元以来的秒或毫秒),要么使用带有yyyy-MM-dd
格式值的TEXT列,因为SQLite中的许多日期时间函数都隐式支持这一点。 / p>