查询不返回任何数据SQLite

时间:2016-12-02 00:19:26

标签: java android string sqlite

我有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

1 个答案:

答案 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>