У меня есть таблица с ключевыми словами в базе данных. Я хочу получить данные столбцов сигналов тревоги и местоположения из этой таблицы и не могу их получить, кроме контактного номера. Сейчас я показываю их значения в тосте, но каждый раз, когда я запускаю любой запрос чтобы показать мой будильник или местоположение в Toast, он пуст. Но всегда отображается мой контактный номер. Не понимаю причину этой проблемы. Я также проверил представление своих таблиц, и в них отображаются значения будильника, местоположения.
Create Table keywords( contact_number text primary key , alarm text , location text )
и моя функция вставки
public boolean insertkeys (String alarm ,String location ,String contact){
SQLiteDatabase db = this.getWritableDatabase();
//ContentValues is a name value pair, used to insert or update values into database tables.
// ContentValues object will be passed to SQLiteDataBase objects insert() and update() functions.
// ContentValues contentValues = new ContentValues();
ContentValues contentValues = new ContentValues();
contentValues.put("alarm",alarm);
contentValues.put("location",location);
contentValues.put("contact_number",contact);
long ins = db.insert("keywords",null,contentValues);
long upd = db.update("keywords",contentValues,"contact_number = ?",new String[]{contact});
// db.close();
if (ins == -1 && upd == -1)
return false;
else
return true;
}
Я вставляю и обновляю свои данные каждый раз, когда нажимается моя кнопка сохранения. Может ли кто-нибудь здесь сказать, как я могу написать запрос для извлечения данных из этих полей и установить для него Toast или Edit text. Я новичок в базе данных и застрял здесь примерно на неделю. Заранее спасибо за помощь :)
Вы извлекаете данные с помощью запроса ВЫБРАТЬ, который возвращается в виде курсора при использовании Android SDK.
Курсор похож на таблицу тем, что имеет несколько строк, каждая из которых имеет определенное количество столбцов в зависимости от того, что вы выбираете.
Чтобы получить все строки, запрос SELECT будет выглядеть следующим образом: -
`SELECT * FROM keywords`
Чтобы сделать это с помощью Android SDK, вы можете использовать удобный метод SQLiteDatabaseзапрос, например. для вышеизложенного вы можете использовать: -
Cursor cursor = db.query("keywords",null,null,null,null,null,null);
Затем вы проходите по возвращенному курсору, извлекая данные, обычно используя методы Курсорпереехать???. Отмечая, что большинство вернет false, если ход не может быть сделан, а также отметив, что исходная позиция в курсоре перед первым рядом
Таким образом, у вас может быть метод, который возвращает курсор согласно: -
public Cursor getAllKeys(){
SQLiteDatabase db = this.getWritableDatabase();
return db.query("keywords",null,null,null,null,null,null);
}
Затем вы можете обработать все строки, используя: -
Cursor csr = yourDBHelper.getAllKeys();
while (csr.moveToNext()) {
String current_contact_number = csr.getString(csr.getColumnIndex("contact_number");
String current_alarm = csr.getString(csr.getColumnIndex("alarm");
String current_location = csr.getString(csr.getColumnIndex("location"));
...... your code to Toast or use the retrieved values
}
csr.close(); //<<<<<<<<<< you should always close a Cursor when finished with it.
Что касается комментария: -
Cursor query which you have suggested I tried to make changes in it like putting column and where clause but after that it returns me nothing when I execute it.Could you tell me that query too.
Следующим может быть способ получить только сигнал тревоги в соответствии с контактным номером.
public String getAlarmByContactNumber(String contactNumber){
String rv = "";
SQLiteDatabase db = this.getWritableDatabase();
Cursor csr = db.query(
"keywords", //<<<<<<<<<<<< the FROM clause (less the FROM keyword) typically the name of the table from which the data is to be extracted (but can include JOINS for example, for more complex queries)
new String[]{"alarm"}, //<<<<<<<<<< A String[] of the column names to be extracted (null equates to * which means all columns) (note can be more complex and include functions/sub queries)
"contact_number=?", //<<<<<<<<<< WHERE clause (less the WHERE keyword) note **?** are place holders for parameters passed as 4th argument
new String[]{contactNumber},
null, //<<<<<<<<<< GROUP BY clause (less the GROUP BY keywords)
null, //<<<<<<<<<< HAVING clause (less the HAVING keyword)
null //<<<<<<<<<< ORDER BY clause (less the ORDER BY keywords)
);
if (csr.moveToFirst()) {
rv = csr.getString(csr.getColumnIndex("alarm"));
}
csr.close();
return rv;
}
@AzmatInayat перейти к следующему по-прежнему будет работать, как если бы была только 1 строка, а затем после этой строки, поскольку курсор затем переместится после последней строки, вернет false и выйдет из цикла while. Если вы знаете, что получите только одну строку, можно использовать моветоперст, НО ВСЕГДА ПРОВЕРЯЙТЕ возвращаемое значение. См. ссылки в ответе для других методов Cursor (например, moveToPosition, moveToPrevious, getInt(), getLong() и т. д. ...........)
Я пытаюсь получить тревогу, местоположение и номер контакта отдельно (например, «Выбрать тревогу из ключевых слов, где контакт_номер =?»), например, отдельный запрос для каждого из них. Запрос курсора, который вы предложили, я пытался внести в него изменения, например, поместить столбец и где пункт, но после этого он мне ничего не возвращает, когда я его выполняю. Не могли бы вы сказать мне и этот запрос. Еще раз спасибо за вашу помощь :)
@AzmatInayat Я отредактировал ответ с примером метода получения сигнала тревоги на основе контактного номера.
Большое спасибо... Запрос отлично работает, чтобы получить все данные. Но если мне нужно получить конкретный столбец, то через какое-то время вместо moveToNext должно прийти