Отображение значений из базы данных в TextView [Android] ⇐ Android
-
Гость
Отображение значений из базы данных в TextView [Android]
Я пытаюсь отобразить значения из активности базы данных, созданной внутри самого приложения. Значения изначально анализировались из файлов XML, а затем сохранялись в БД. Я провел много поисков и попробовал несколько методов решения, но, похоже, застрял. Если бы кто-нибудь мог мне помочь, было бы здорово!
В, (I) Значения должны отображаться в TextView после выбора элемента из ListView. Для этого я настроил onItemClickListener в действии ListView (ListRSSItemsActivity) и намерение запустить новое действие, а также создал соответствующий файл макета. Я более или менее знаком с тем, как заставить TextView работать. Но я не уверен, что сейчас поместить в файл New Activity (ArticleActivity). (II) Когда я нажимаю на элемент и открывается новое окно, отображается пустой экран.
Я прикрепил новый класс активности и файл макета.
Активность статьи:
публичный класс ArticleActivity расширяет Activity{ @Override public void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.article_view); Название строки, описание; title=this.getIntent().getStringExtra("TAG_TITLE"); описание = this.getIntent().getStringExtra("TAG_DESCRIPTION"); } } article_view.xml:
ListRSSItemsActivity:
публичный класс ListRSSItemsActivity расширяет ListActivity { // Диалог прогресса частный ProgressDialog pDialog; // Список массивов для просмотра списка ArrayList rssItemList = новый ArrayList(); RSSParser rssParser = новый RSSParser(); List rssItems = новый ArrayList(); RSSFed rssFeed; общедоступная статическая строка TAG_TITLE = «заголовок»; частная статическая строка TAG_LINK = «ссылка»; частная статическая строка TAG_DESCRIPTION = «описание»; частная статическая строка TAG_PUBDATE = «pub_date»; частная статическая строка TAG_GUID = «guid»; // не используется @Override public void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); // setContentView(R.layout.rss_item_list); // получаем данные о намерении Намерение я = getIntent(); // Идентификатор строки SQLite Целое число site_id = Integer.parseInt(i.getStringExtra("id")); // Получение единого веб-сайта из SQLite RSSDatabaseHandler rssDB = новый RSSDatabaseHandler(getApplicationContext()); Сайт веб-сайта = rssDB.getSite(site_id); Строка rss_link = site.getRSSLink(); /** * Вызов фоновой темы загружает последние статьи веб-сайта. * @param RSS URL-адрес веб-сайта * */ новый loadRSSFeedItems().execute(rss_link); // выбор одного элемента ListView ListView lv = getListView(); // Запуск нового экрана при выборе одного элемента списка lv.setOnItemClickListener(новый OnItemClickListener() { public void onItemClick (родительский элемент AdapterView, представление просмотра, int позиция, длинный идентификатор) { // получаем список Просмотр v = (View)view.getParent(); TextView tv = (TextView)v.findViewById(R.id.title); Строка title = tv.getText().toString(); Описание строки = ((TextView) view.findViewById(R.id.link)).getText().toString(); // Начинаем новое намерение Намерение ia = новое намерение (getApplicationContext(), ArticleActivity.class); ia.putExtra("TAG_TITLE", заголовок); ia.putExtra("TAG_DESCRIPTION", описание); StartActivity (IA); } }); } /** * Фоновая асинхронная задача для получения данных элементов RSS-канала из URL-адреса. * */ класс loadRSSFeedItems расширяет AsyncTask { /** * Перед запуском фонового потока показать диалог прогресса. * */ @Override защищенный недействительный onPreExecute () { супер.onPreExecute(); pDialog = новый ProgressDialog( ListRSSItemsActivity.this); pDialog.setMessage("Загрузка последних статей..."); pDialog.setIndeterminate(ложь); pDialog.setCancelable(ложь); pDialog.show(); } /** * получение всех последних статей и отображение их в списке * */ @Override защищенная строка doInBackground(String... аргументы) { // URL-адрес RSS-ссылки Строка rss_url = args[0]; // список элементов RSS // используем метод GET для получения элементов rssfeeditems. ВНИМАНИЕ: здесь только с RSS_URL! rssItems = rssParser.getRSSFeedItems(rss_url); // проходим по каждому элементу for (элемент RSSItem: rssItems) { // создаем новый HashMap HashMap карта = новый HashMap(); //добавляем каждый дочерний узел в ключ HashMap => значение map.put(TAG_TITLE, item.getTitle()); map.put(TAG_LINK, item.getLink()); map.put(TAG_PUBDATE, item.getPubDate()); Строковое описание = item.getDescription(); // берём из описания всего 200 символов если(description.length() > 100){ описание = описание.подстрока(0, 97) + ".."; } map.put(TAG_DESCRIPTION, описание); // добавляем HashList в ArrayList rssItemList.add(карта); } // обновление пользовательского интерфейса из фонового потока runOnUiThread (новый Runnable () { общественный недействительный запуск () { /** * Обновление проанализированных элементов в списке. * */ Адаптер ListAdapter = новый SimpleAdapter( ListRSSItemsActivity.this, rssItemList, R.layout.rss_item_list_row, новая строка[] {TAG_LINK, TAG_TITLE, TAG_PUBDATE, TAG_DESCRIPTION }, новый int[] { R.id.page_url, R.id.title, R.id.pub_date, R.id.link }); // обновление списка setListAdapter (адаптер); } }); вернуть ноль; } /** * После завершения фоновой задачи. Закрыть диалог прогресса. * **/ protected void onPostExecute (String args) { // закрываем диалог после получения всех товаров pDialog.dismiss(); } } } Активность в базе данных:
публичный класс RSSDatabaseHandler расширяет SQLiteOpenHelper{ // Версия базы данных частный статический окончательный интервал DATABASE_VERSION = 1; // Имя базы данных частная статическая окончательная строка DATABASE_NAME = "rssReader"; // Имя таблицы контактов частная статическая окончательная строка TABLE_RSS = «веб-сайты»; // Имена столбцов таблицы контактов частная статическая окончательная строка KEY_ID = «id»; частная статическая окончательная строка KEY_TITLE = "title"; частная статическая окончательная строка KEY_LINK = «ссылка»; частная статическая финальная строка KEY_RSS_LINK = «rss_link»; частная статическая окончательная строка KEY_DESCRIPTION = «описание»; частная статическая окончательная строка KEY_PUBDATE = «pub_date»; public RSSDatabaseHandler (контекст контекста) { супер (контекст, DATABASE_NAME, null, DATABASE_VERSION); } // Создание таблиц @Override общественная недействительность onCreate (SQLiteDatabase db) { Строка CREATE_RSS_TABLE = "CREATE TABLE" + TABLE_RSS + "(" + KEY_ID + «ЦЕЛЫЙ ПЕРВИЧНЫЙ КЛЮЧ», + KEY_TITLE + «ТЕКСТ», + KEY_LINK + " ТЕКСТ" + KEY_RSS_LINK + " ТЕКСТ" + KEY_DESCRIPTION + " ТЕКСТ" + KEY_PUBDATE + " ТЕКСТ" + ")"; db.execSQL(CREATE_RSS_TABLE); } // Обновление базы данных @Override public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { // Удалить старую таблицу, если она существовала db.execSQL("УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ" + TABLE_RSS); // Создаём таблицы заново onCreate (дб); } /** * Добавление нового веб-сайта в таблицу веб-сайтов. Функция проверит, есть ли сайт * уже существует в базе данных. Если существует, обновит старый еще * создает новую строку * */ public void addSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); Значения ContentValues = новые ContentValues(); значения.put(KEY_TITLE, site.getTitle()); // Заголовок сайта значения.put(KEY_LINK, site.getLink()); // адрес сайта значения.put(KEY_RSS_LINK, site.getRSSLink()); // URL-адрес RSS-ссылки значения.put(KEY_DESCRIPTION, site.getDescription()); // описание сайта значения.put(KEY_PUBDATE, site.getPubDate()); // Проверяем, существует ли уже строка в базе данных if (!isSiteExists(db, site.getRSSLink())) { //сайт не существует, создаем новую строку db.insert(TABLE_RSS, ноль, значения); БД.закрыть(); } еще { // сайт уже существует, обновляем строку updateSite (сайт); БД.закрыть(); } } /** * Чтение всех строк из базы данных * */ публичный список getAllSites() { List siteList = новый ArrayList(); // Выбрать весь запрос Строка selectQuery = "SELECT * FROM" + TABLE_RSS + "ЗАКАЗАТЬ ПО id DESC"; SQLiteDatabase db = this.getReadableDatabase(); Курсор курсора = db.rawQuery(selectQuery, null); // проходим по всем строкам и добавляем в список если (cursor.moveToFirst()) { делать { Сайт веб-сайта = новый веб-сайт (); site.setId(Integer.parseInt(cursor.getString(0))); site.setTitle(cursor.getString(1)); site.setLink(cursor.getString(2)); site.setRSSLink(cursor.getString(3)); site.setDescription(cursor.getString(4)); site.setPubDate(cursor.getString(5)); // Добавляем контакт в список siteList.add(сайт); } Пока (cursor.moveToNext()); } курсор.закрыть(); БД.закрыть(); // возвращаем список контактов вернуть список сайтов; } /** * Обновление одной строки будет идентифицировано по RSS-ссылке. * */ public int updateSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); Значения ContentValues = новые ContentValues(); значения.put(KEY_TITLE, site.getTitle()); значения.put(KEY_LINK, site.getLink()); значения.put(KEY_RSS_LINK, site.getRSSLink()); значения.put(KEY_DESCRIPTION, site.getDescription()); значения.put(KEY_PUBDATE, site.getPubDate()); // обновляем возврат строки int update = db.update(TABLE_RSS, значения, KEY_RSS_LINK + " =?", новая String[] { String.valueOf(site.getRSSLink()) }); БД.закрыть(); возврат обновления; } /** * Чтение строки (веб-сайта) идентифицируется по идентификатору строки. * */ // Объявление публичный веб-сайт getSite (int id) { SQLiteDatabase db = this.getReadableDatabase(); Курсор курсора = db.query(TABLE_RSS, new String[] { KEY_ID, KEY_TITLE, KEY_LINK, KEY_RSS_LINK, KEY_DESCRIPTION, KEY_PUBDATE }, KEY_ID + "=?", новая String[] { String.valueOf(id) }, null, null, null, null); если (курсор != ноль) курсор.moveToFirst(); Сайт веб-сайта = новый веб-сайт (cursor.getString(1), курсор.getString(2), курсор.getString(3), курсор.getString(4), курсор.getString(5)); site.setId(Integer.parseInt(cursor.getString(0))); site.setTitle(cursor.getString(1)); site.setLink(cursor.getString(2)); site.setRSSLink(cursor.getString(3)); site.setDescription(cursor.getString(4)); site.setPubDate(cursor.getString(5)); курсор.закрыть(); БД.закрыть(); возвратный участок; } /** * Удаление одной строки * */ public void deleteSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_RSS, KEY_ID + " =?", новая String[] { String.valueOf(site.getId())}); БД.закрыть(); } /** * Проверка существования сайта осуществляется путем сопоставления rss. * связь * */ public boolean isSiteExists(SQLiteDatabase db, String rss_link) { Курсор курсора = db.rawQuery("ВЫБРАТЬ 1 ИЗ " + TABLE_RSS + " WHERE rss_link = '" + rss_link + "'", new String[] {}); логическое значение существует = (cursor.getCount() > 0); возврат существует; } }
Я пытаюсь отобразить значения из активности базы данных, созданной внутри самого приложения. Значения изначально анализировались из файлов XML, а затем сохранялись в БД. Я провел много поисков и попробовал несколько методов решения, но, похоже, застрял. Если бы кто-нибудь мог мне помочь, было бы здорово!
В, (I) Значения должны отображаться в TextView после выбора элемента из ListView. Для этого я настроил onItemClickListener в действии ListView (ListRSSItemsActivity) и намерение запустить новое действие, а также создал соответствующий файл макета. Я более или менее знаком с тем, как заставить TextView работать. Но я не уверен, что сейчас поместить в файл New Activity (ArticleActivity). (II) Когда я нажимаю на элемент и открывается новое окно, отображается пустой экран.
Я прикрепил новый класс активности и файл макета.
Активность статьи:
публичный класс ArticleActivity расширяет Activity{ @Override public void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.article_view); Название строки, описание; title=this.getIntent().getStringExtra("TAG_TITLE"); описание = this.getIntent().getStringExtra("TAG_DESCRIPTION"); } } article_view.xml:
ListRSSItemsActivity:
публичный класс ListRSSItemsActivity расширяет ListActivity { // Диалог прогресса частный ProgressDialog pDialog; // Список массивов для просмотра списка ArrayList rssItemList = новый ArrayList(); RSSParser rssParser = новый RSSParser(); List rssItems = новый ArrayList(); RSSFed rssFeed; общедоступная статическая строка TAG_TITLE = «заголовок»; частная статическая строка TAG_LINK = «ссылка»; частная статическая строка TAG_DESCRIPTION = «описание»; частная статическая строка TAG_PUBDATE = «pub_date»; частная статическая строка TAG_GUID = «guid»; // не используется @Override public void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); // setContentView(R.layout.rss_item_list); // получаем данные о намерении Намерение я = getIntent(); // Идентификатор строки SQLite Целое число site_id = Integer.parseInt(i.getStringExtra("id")); // Получение единого веб-сайта из SQLite RSSDatabaseHandler rssDB = новый RSSDatabaseHandler(getApplicationContext()); Сайт веб-сайта = rssDB.getSite(site_id); Строка rss_link = site.getRSSLink(); /** * Вызов фоновой темы загружает последние статьи веб-сайта. * @param RSS URL-адрес веб-сайта * */ новый loadRSSFeedItems().execute(rss_link); // выбор одного элемента ListView ListView lv = getListView(); // Запуск нового экрана при выборе одного элемента списка lv.setOnItemClickListener(новый OnItemClickListener() { public void onItemClick (родительский элемент AdapterView, представление просмотра, int позиция, длинный идентификатор) { // получаем список Просмотр v = (View)view.getParent(); TextView tv = (TextView)v.findViewById(R.id.title); Строка title = tv.getText().toString(); Описание строки = ((TextView) view.findViewById(R.id.link)).getText().toString(); // Начинаем новое намерение Намерение ia = новое намерение (getApplicationContext(), ArticleActivity.class); ia.putExtra("TAG_TITLE", заголовок); ia.putExtra("TAG_DESCRIPTION", описание); StartActivity (IA); } }); } /** * Фоновая асинхронная задача для получения данных элементов RSS-канала из URL-адреса. * */ класс loadRSSFeedItems расширяет AsyncTask { /** * Перед запуском фонового потока показать диалог прогресса. * */ @Override защищенный недействительный onPreExecute () { супер.onPreExecute(); pDialog = новый ProgressDialog( ListRSSItemsActivity.this); pDialog.setMessage("Загрузка последних статей..."); pDialog.setIndeterminate(ложь); pDialog.setCancelable(ложь); pDialog.show(); } /** * получение всех последних статей и отображение их в списке * */ @Override защищенная строка doInBackground(String... аргументы) { // URL-адрес RSS-ссылки Строка rss_url = args[0]; // список элементов RSS // используем метод GET для получения элементов rssfeeditems. ВНИМАНИЕ: здесь только с RSS_URL! rssItems = rssParser.getRSSFeedItems(rss_url); // проходим по каждому элементу for (элемент RSSItem: rssItems) { // создаем новый HashMap HashMap карта = новый HashMap(); //добавляем каждый дочерний узел в ключ HashMap => значение map.put(TAG_TITLE, item.getTitle()); map.put(TAG_LINK, item.getLink()); map.put(TAG_PUBDATE, item.getPubDate()); Строковое описание = item.getDescription(); // берём из описания всего 200 символов если(description.length() > 100){ описание = описание.подстрока(0, 97) + ".."; } map.put(TAG_DESCRIPTION, описание); // добавляем HashList в ArrayList rssItemList.add(карта); } // обновление пользовательского интерфейса из фонового потока runOnUiThread (новый Runnable () { общественный недействительный запуск () { /** * Обновление проанализированных элементов в списке. * */ Адаптер ListAdapter = новый SimpleAdapter( ListRSSItemsActivity.this, rssItemList, R.layout.rss_item_list_row, новая строка[] {TAG_LINK, TAG_TITLE, TAG_PUBDATE, TAG_DESCRIPTION }, новый int[] { R.id.page_url, R.id.title, R.id.pub_date, R.id.link }); // обновление списка setListAdapter (адаптер); } }); вернуть ноль; } /** * После завершения фоновой задачи. Закрыть диалог прогресса. * **/ protected void onPostExecute (String args) { // закрываем диалог после получения всех товаров pDialog.dismiss(); } } } Активность в базе данных:
публичный класс RSSDatabaseHandler расширяет SQLiteOpenHelper{ // Версия базы данных частный статический окончательный интервал DATABASE_VERSION = 1; // Имя базы данных частная статическая окончательная строка DATABASE_NAME = "rssReader"; // Имя таблицы контактов частная статическая окончательная строка TABLE_RSS = «веб-сайты»; // Имена столбцов таблицы контактов частная статическая окончательная строка KEY_ID = «id»; частная статическая окончательная строка KEY_TITLE = "title"; частная статическая окончательная строка KEY_LINK = «ссылка»; частная статическая финальная строка KEY_RSS_LINK = «rss_link»; частная статическая окончательная строка KEY_DESCRIPTION = «описание»; частная статическая окончательная строка KEY_PUBDATE = «pub_date»; public RSSDatabaseHandler (контекст контекста) { супер (контекст, DATABASE_NAME, null, DATABASE_VERSION); } // Создание таблиц @Override общественная недействительность onCreate (SQLiteDatabase db) { Строка CREATE_RSS_TABLE = "CREATE TABLE" + TABLE_RSS + "(" + KEY_ID + «ЦЕЛЫЙ ПЕРВИЧНЫЙ КЛЮЧ», + KEY_TITLE + «ТЕКСТ», + KEY_LINK + " ТЕКСТ" + KEY_RSS_LINK + " ТЕКСТ" + KEY_DESCRIPTION + " ТЕКСТ" + KEY_PUBDATE + " ТЕКСТ" + ")"; db.execSQL(CREATE_RSS_TABLE); } // Обновление базы данных @Override public void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) { // Удалить старую таблицу, если она существовала db.execSQL("УДАЛИТЬ ТАБЛИЦУ, ЕСЛИ СУЩЕСТВУЕТ" + TABLE_RSS); // Создаём таблицы заново onCreate (дб); } /** * Добавление нового веб-сайта в таблицу веб-сайтов. Функция проверит, есть ли сайт * уже существует в базе данных. Если существует, обновит старый еще * создает новую строку * */ public void addSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); Значения ContentValues = новые ContentValues(); значения.put(KEY_TITLE, site.getTitle()); // Заголовок сайта значения.put(KEY_LINK, site.getLink()); // адрес сайта значения.put(KEY_RSS_LINK, site.getRSSLink()); // URL-адрес RSS-ссылки значения.put(KEY_DESCRIPTION, site.getDescription()); // описание сайта значения.put(KEY_PUBDATE, site.getPubDate()); // Проверяем, существует ли уже строка в базе данных if (!isSiteExists(db, site.getRSSLink())) { //сайт не существует, создаем новую строку db.insert(TABLE_RSS, ноль, значения); БД.закрыть(); } еще { // сайт уже существует, обновляем строку updateSite (сайт); БД.закрыть(); } } /** * Чтение всех строк из базы данных * */ публичный список getAllSites() { List siteList = новый ArrayList(); // Выбрать весь запрос Строка selectQuery = "SELECT * FROM" + TABLE_RSS + "ЗАКАЗАТЬ ПО id DESC"; SQLiteDatabase db = this.getReadableDatabase(); Курсор курсора = db.rawQuery(selectQuery, null); // проходим по всем строкам и добавляем в список если (cursor.moveToFirst()) { делать { Сайт веб-сайта = новый веб-сайт (); site.setId(Integer.parseInt(cursor.getString(0))); site.setTitle(cursor.getString(1)); site.setLink(cursor.getString(2)); site.setRSSLink(cursor.getString(3)); site.setDescription(cursor.getString(4)); site.setPubDate(cursor.getString(5)); // Добавляем контакт в список siteList.add(сайт); } Пока (cursor.moveToNext()); } курсор.закрыть(); БД.закрыть(); // возвращаем список контактов вернуть список сайтов; } /** * Обновление одной строки будет идентифицировано по RSS-ссылке. * */ public int updateSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); Значения ContentValues = новые ContentValues(); значения.put(KEY_TITLE, site.getTitle()); значения.put(KEY_LINK, site.getLink()); значения.put(KEY_RSS_LINK, site.getRSSLink()); значения.put(KEY_DESCRIPTION, site.getDescription()); значения.put(KEY_PUBDATE, site.getPubDate()); // обновляем возврат строки int update = db.update(TABLE_RSS, значения, KEY_RSS_LINK + " =?", новая String[] { String.valueOf(site.getRSSLink()) }); БД.закрыть(); возврат обновления; } /** * Чтение строки (веб-сайта) идентифицируется по идентификатору строки. * */ // Объявление публичный веб-сайт getSite (int id) { SQLiteDatabase db = this.getReadableDatabase(); Курсор курсора = db.query(TABLE_RSS, new String[] { KEY_ID, KEY_TITLE, KEY_LINK, KEY_RSS_LINK, KEY_DESCRIPTION, KEY_PUBDATE }, KEY_ID + "=?", новая String[] { String.valueOf(id) }, null, null, null, null); если (курсор != ноль) курсор.moveToFirst(); Сайт веб-сайта = новый веб-сайт (cursor.getString(1), курсор.getString(2), курсор.getString(3), курсор.getString(4), курсор.getString(5)); site.setId(Integer.parseInt(cursor.getString(0))); site.setTitle(cursor.getString(1)); site.setLink(cursor.getString(2)); site.setRSSLink(cursor.getString(3)); site.setDescription(cursor.getString(4)); site.setPubDate(cursor.getString(5)); курсор.закрыть(); БД.закрыть(); возвратный участок; } /** * Удаление одной строки * */ public void deleteSite (сайт веб-сайта) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_RSS, KEY_ID + " =?", новая String[] { String.valueOf(site.getId())}); БД.закрыть(); } /** * Проверка существования сайта осуществляется путем сопоставления rss. * связь * */ public boolean isSiteExists(SQLiteDatabase db, String rss_link) { Курсор курсора = db.rawQuery("ВЫБРАТЬ 1 ИЗ " + TABLE_RSS + " WHERE rss_link = '" + rss_link + "'", new String[] {}); логическое значение существует = (cursor.getCount() > 0); возврат существует; } }
Мобильная версия