Запрос не работает по назначению

У меня есть запрос, который я пытаюсь выполнить в таблице SQLite. В таблице есть записи, и они сопоставляются с аргументами выбора, которые я передаю. Ниже приведены мои запросы и глобальные строки:

// Table Notifications
 public static final String notificationfor = "NotificationFor";
 public static final String datetonotify = "DateToNotify";
 public static final String isextraordinary = "IsExtraordinary";
 public static final String notificationdata = "NotificationData";
 public static final String notificationdatefor= "NotificationDateFor";
 public static final String primaryid= "PrimaryId"; 


Cursor c = mDb.rawQuery("select DateToNotify from " + DATABASE_TABLE1 + 
 " where " + primaryid + " = ? AND " + notificationfor + " = ?", new String[] { D, selection });

Это дает мне нуль в курсоре, если я передаю 1 и 1 в качестве аргументов (записи записываются в аргументы, которые я передаю)

Однако, когда я выполняю следующий запрос, он отлично работает:

String Tets = "Select DateToNotify from Notifications WHERE PrimaryId = 1 AND NotificationFor =1";
 Cursor c = mDb.rawQuery(Tets, null);

РЕДАКТИРОВАТЬ

Я просто попробовал следующее, и он работает:

String Tets = "Select DateToNotify from Notifications WHERE PrimaryId =" +D+ " AND NotificationFor ="+selection;
 Cursor c = mDb.rawQuery(Tets, null);

Вся функция выглядит так:

public Cursor alertQueryYYYY(String D, String selection){

 // Cursor c = mDb.rawQuery("select DateToNotify from " + DATABASE_TABLE1 + 
 // " where " + primaryid + " = ? AND " + notificationfor + " = ?", new String[] { D, selection });

 String Tets = "Select DateToNotify from Notifications WHERE PrimaryId =" +D+ " AND NotificationFor ="+selection;
 Cursor c = mDb.rawQuery(Tets, null); 


 String K = "select DateToNotify from " + DATABASE_TABLE1 + 
 " where " + primaryid + " = ? AND " + notificationfor + " = ?"; // new String[] { D, selection })

 System.out.println("Here I am " + K); 
 return c;

 }

Это образ моей таблицы, так как у меня нет хорошего программного обеспечения для редактирования изображений, поэтому я добавил его на другой веб-сайт для ясности.

EDIT Ниже приведена строка создания базы данных и, как указано в CL, ошибка заключается в несовпадающих типах.

private static final String DATABASE_CREATE1 ="create table Notifications(_id integer primary key autoincrement, "
 +"NotificationFor Integer," // Weeks/Seconds etc /7 variables
 +"DateToNotify text," // Date of Notification
 +"isExtraordinary Integer," // Special notifications, yet unknown
 +"NotificationData Integer," // Weeks/Seconds/ etc / 7 variables
 +"NotificationDateFor text,"
 +"PrimaryId);";
2 ответа

Номер 1 не совпадает с строкой "1", поэтому вы не найдете запись, если ищете идентификатор неправильного типа.

Параметры запроса полезны, чтобы избежать проблем с форматированием и атак SQL-инъекций. Эти проблемы могут возникать только со строками, а не с целыми числами, поэтому для использования целых значений в вашем запросе вам не следует использовать параметры, а просто вставлять значения напрямую:

"... WHERE PrimaryId =" +D+ " AND NotificationFor ="+selection;


Я предпочитаю этот способ использовать запросы:

final SQLiteDatabase database = getReadableDatabase();
 final String[] projection = new String[] {datetonotify };
 final String selection = primaryid + "=? " +notificationfor +"=?";
 final String[] having = new String[] {D,selection};
 Cursor cursor = database.query(DATABASE_TABLE1, projection, selection, having,
 null, null, null, null);

Ваш код должен работать, если есть ошибка, он не находится в параметрах, но может быть в переменной DATABASE_TABLE1.

licensed under cc by-sa 3.0 with attribution.