Как мне выбрать строки из таблицы?

#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