#java #android #sqlite #android-sqlite
#java #Android #sqlite #android-sqlite
Вопрос:
Я создаю приложение, в котором MainActivity имеет RecyclerView, содержащий списки пользователей, например, список покупок, еженедельный список и т.д.
Когда пользователь нажимает на элемент, он переходит к продуктам, активность также имеет RecyclerView. У меня есть 2 разные базы данных SQLite 1: списки 2: продукты.
Логика, которую я использовал, заключается в том, что когда пользователь добавляет список, база данных списков записывает имя и идентификатор списка, также добавляет имя списка в базу данных продуктов, а когда пользователь добавляет продукт, я использовал update()
вместо insert()
in SQLite
, потому что столбец уже существует, поэтому название и идентификатор продукта будут обновлены в базе данных продуктов.
Это структура списка и таблицы продуктов:
LISTS
ID LIST_NAME
1 1 list 1
2 2 list 2
PRODUCTS
ID LIST_NAME PRODUCT_NAME
1 1 list 1 product1 in list1
2 2 list 1 product2 in list1
проблема в том, что когда я добавляю список, а затем перехожу к продуктам, я вижу эту ошибку :
android.database.sqlite.SQLiteException: no such column: list (Sqlite code 1 SQLITE_ERROR): , while compiling: SELECT * FROM prducts WHERE LIST_NAME = list, (OS error - 2:No such file or directory)
это метод внутри SQLiteOpenHelper
, и ошибка отображается в этой строке: cursor = db.rawQuery(productsQuery, null);
public Cursor getAllProducts(String list_name)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = null;
if (db != null)
{
String productsQuery = " SELECT * FROM " DB_TABLE " WHERE " LIST_NAME_COLUMN " = " list_name;
cursor = db.rawQuery(productsQuery, null);
}
return cursor;
}
в product activity я использовал Bundle bundle = getIntent().getExtras();
для передачи имени списка из list activity. и в list activity я использовал intent.putExtra("list_name", list_name);
Ответ №1:
Вы передаете значение строки list_name
, заключенной в кавычки в инструкции sql, поэтому оно рассматривается как имя столбца.
Используйте ?
заполнитель в вашем запросе и передайте list_name
в качестве 2-го аргумента rawQuery()
:
String productsQuery = "SELECT * FROM " DB_TABLE " WHERE " LIST_NAME_COLUMN " = ?";
cursor = db.rawQuery(productsQuery, new String[] {list_name});
Таким образом, вам не нужно беспокоиться о цитировании параметров, которые вы передаете в запрос.
Комментарии:
1. спасибо за ваш ответ @forpas ошибка исчезла, но элементы в
ProductsActivity
не отображаются, хотя они есть в базе данных! если только запрос не выглядит так:"SELECT * FROM" DB_TABLE
но он показывает всю таблицу целиком2. @FathiOmer Это другое требование. Для уточнения отправьте новый вопрос с кодом, который заполняет recyclerview.
3. к сожалению, произошел конфликт между
update()
иinsert()
в sqlite. спасибо @forpas