Như các tài liệu Android nói, selectionArgs các tham số của phương thức rawQuery được phân tích thành chuỗi.SQLite rawQuery selectionArgs và số nguyên Fields
SQLiteDatabase.rawQuery (String sql, String [] selectionArgs)
selectionArgs: Bạn có thể bao gồm s trong mệnh đề where trong truy vấn, mà sẽ được thay thế bằng các giá trị từ selectionArgs?. Các giá trị sẽ bị ràng buộc dưới dạng Chuỗi.
Nhưng hôm nay, tôi đã phải đối mặt với một vấn đề mất một phần lớn trong ngày của tôi. Hãy tưởng tượng truy vấn sau:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= 15
COLUMN_A là INTEGER. Bảng có khoảng 10 hàng tham dự tiêu chí đó. Chạy truy vấn trên trình soạn thảo cơ sở dữ liệu, kết quả luôn đúng, nhưng trên điện thoại thông minh, câu lệnh luôn trả về không có hàng.
Sau một thời gian, một thay đổi truy vấn để:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= '15'
và biên tập lại không có hàng, giống như Android. Vì vậy, việc thay đổi truy vấn thành:
SELECT * FROM TABLE_A WHERE CAST(IFNULL(COLUMN_A, 0) as INTEGER) >= '15'
giải quyết được sự cố. Một thử nghiệm khác đã được thực hiện là:
SELECT * FROM TABLE_A WHERE COLUMN_A >= '15'
cũng, trả lại kết quả chính xác.
Điều này dường như là một vấn đề liên quan đến cách Android giới hạn các tham số cho truy vấn (dưới dạng chuỗi) với mệnh đề IFNULL.
Vì vậy, không ai biết tại sao điều này xảy ra? Có bất kỳ đề xuất nào để giải quyết vấn đề này mà không sử dụng CAST trên truy vấn không?
Tôi gặp sự cố tương tự và tôi đã dành một giờ để tìm lỗi trong ứng dụng của mình. Sau đó, tôi đã tìm thấy bài đăng của bạn. Vì vậy, nó thực sự tuyệt vời bạn đã viết nó ở đây. Một điều nữa là tôi sẽ không bao giờ hiểu triết lý của Android và tại sao CAST này lại phải ở đây .... – user2707175