Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
#1

Вывод из базы данных в ListView через SimpleCursorAdapter - Программирование Android

15.05.2015, 21:06. Просмотров 4019. Ответов 26
Метки нет (Все метки)

Доброе время суток.
Пишу программу под Андроид в среде Android Studio и возникла проблема с выводом данных в listview через SimpleCursorAdapter.
Суть: программа сохраняет результаты проверки в БД, затем при переходе в окно "Результаты" отображает их через listview.
ПРОБЛЕМА: не выводит данные из БД.
ПОДРОБНЕЕ:Проблем с записью в БД нет, проверялось - данные записываются, ошибку выбивает в самом приложении при переходе на окно с выводом результатов на телефоне "В приложении произошла ошибка".

Активити, которое должно выводить:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.SimpleCursorAdapter;
import android.widget.ListView;
 
 
public class Results extends ActionBarActivity {
     DatabaseHelper dbHelper;
    SQLiteDatabase sdb;
    SimpleCursorAdapter scAdapter;
    ListView list;
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.results);
        dbHelper = new DatabaseHelper(this, "mydatabase.db", null, 1);
        sdb = dbHelper.getWritableDatabase();
 
        Cursor cursor = sdb.query("rezults", new String[]{dbHelper.NAME_COLUMN, dbHelper.MARK_COLUMN},
                null, null,
                null, null, null);
 
        // формируем столбцы сопоставления
        String[] from = new String[] { dbHelper.NAME_COLUMN, dbHelper.MARK_COLUMN };
        int[] to = new int[] { R.id.tvName, R.id.tvMark };
 
        // создаем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to,0);
        list = (ListView) findViewById(R.id.listView);
        list.setAdapter(scAdapter);
 
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_results, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
 
        int id = item.getItemId();
 
 
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
 
 
}
Класс базы данных:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
 
import android.content.Context;
import android.database.Cursor;
 
public class DatabaseHelper extends SQLiteOpenHelper implements BaseColumns {
 
    private static final String DATABASE_NAME = "mydatabase.db";
    private static final String DATABASE_TABLE = "rezults";
 
    public static final String NAME_COLUMN = "name";
    public static final String MARK_COLUMN = "marks";
 
    private static final String DATABASE_CREATE_SCRIPT = "create table "
            + DATABASE_TABLE + " (" + BaseColumns._ID
            + " integer primary key autoincrement, " + NAME_COLUMN
            + " text not null, " + MARK_COLUMN + " integer);";
 
    public DatabaseHelper(Context context, String name, CursorFactory factory,
                          int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);
        // TODO Auto-generated constructor stub
    }
 
    public DatabaseHelper(Context context, String name, CursorFactory factory,
                          int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }
 
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(DATABASE_CREATE_SCRIPT);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        // Запишем в журнал
     //   Log.w("SQLite", "Обновляемся с версии " + oldVersion + " на версию " + newVersion);
 
        // Удаляем старую таблицу и создаём новую
        db.execSQL("DROP TABLE IF IT EXIST " + DATABASE_TABLE);
        // Создаём новую таблицу
        onCreate(db);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2015, 21:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод из базы данных в ListView через SimpleCursorAdapter (Программирование Android):

ListView, База данных и SimpleCursorAdapter - onItemClick срабатывает только после добавления данных - Программирование Android
Здравствуйте! Подскажите, плиз, решение проблемы новичку... есть БД... подключаюсь через SimpleCursorAdapter ... Нажатие на строке...

Переход на новое activity с элемента listView, заполненного через SimpleCursorAdapter - Программирование Android
Здравствуйте! Помогите разобраться с такой проблемой: Есть список listView, который получает данные из БД через SimpleCursorAdapter. По...

Прикрутить RadioGroup к ListView(SimpleCursorAdapter) - Программирование Android
Не могу понять как реализовать одиночный выбор из списка: Сейчас выводит список компаний, где я могу сделать множественный выбор, а мне...

SimpleCursorAdapter(ListView заполняется данными только после прокрутки скрола) - Программирование Android
Помогите решить задачу. У меня ListView начинает заполняться данными, только после первой прокрутки списка. Т.е в начальный момент список...

Listview вывод данных и переход по нажатию на другой Listview SQLite - Программирование Android
Доброго извините за название темы, долго не мог сформировать название, В общем у меня беда с пытаюсь написать программу где первый экран...

Получение данных с SimpleCursorAdapter - Программирование Android
Скопировал себе в приложение пример из библиотеки шерлок, с табами. оно работает хорошо, но мне нужно переделать ее под свои нужды. И во...

26
Mikalai
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
15.05.2015, 21:08 #2
Лог ошибки можно увидеть?
0
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
15.05.2015, 21:13  [ТС] #3
Сама среда не определяет ошибку.Ошибка есть только на самом телефоне.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
15.05.2015, 21:15 #4
Покажи-ка этого зверя

BaseColumns._ID
А уже сам увидел откуда ты его дёргаешь.
0
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
15.05.2015, 21:21  [ТС] #5
А как его показать? ХУХ)

Добавлено через 4 минуты
До этого пробовала вот таким образом выводить:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 List<String> list = new ArrayList<>();
        Spinner spinner = (Spinner) findViewById(R.id.spinner);
 
        while (cursor.moveToNext()) {
            String name = cursor.getString(cursor.getColumnIndex(dbHelper.NAME_COLUMN));
            int mark = cursor.getInt(cursor.getColumnIndex(dbHelper.MARK_COLUMN));
            Log.i("LOG_TAG", "ROW " +name + " HAS NAME " + mark);
 
            list.add(name +" "+ mark);
            // Создаем адаптер
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
 
            dataAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            dataAdapter.notifyDataSetChanged();
            spinner.setAdapter(dataAdapter);
        }
        cursor.close();
Выводит, но если именно в листвью, - то в приложении пишет ошибку.
К несчастья, совсем недавно начала разбираться с программирование под Андроид, поэтому проблем много(
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.05.2015, 12:07 #6
Rilina, девушка, тут у вас куча проблем. Во-первых, перед циклом нет проверки cursor != null. Во-вторых, нет проверки if (cursor.moveToFirst())... В-третьих, нет проверки, что cursor.getColumnIndex(dbHelper.NAME_COLUMN) >= 0. В-четвёртых, в цикле вы каждый раз инициализируете dataAdapter (и делаете другие действия с ним).
И где сообщение об ошибке? Где ListView?
0
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
16.05.2015, 12:48  [ТС] #7
Пробовала с проверкой cursor != null...
Разные варианты пробовала, но ничего не получилось. Не могли бы Вы помочь хотя бы примером?

Добавлено через 22 минуты
Последний вариант у меня вот такой, но не рабочий(
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.results);
        dbHelper = new DatabaseHelper(this, "mydatabase.db", null, 1);
        sdb = dbHelper.getWritableDatabase();
       // List<String> list = new ArrayList<>();
        Cursor cursor = sdb.query("rezults", new String[]{dbHelper.NAME_COLUMN, dbHelper.MARK_COLUMN},
                null, null,
                null, null, null);
        
        // формируем столбцы сопоставления
        String[] from = new String[] { dbHelper.NAME_COLUMN, dbHelper.MARK_COLUMN };
        int[] to = new int[] { R.id.tvName, R.id.tvMark };
 
        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to,0);
        list = (ListView) findViewById(R.id.listView);
        list.setAdapter(scAdapter);
}
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
16.05.2015, 23:23 #8
Rilina, прошу прощения, я раскритиковал код, который заполнял Spinner через ArrayAdapter.
Как я вижу, http://startandroid.ru/ru/uroki/vse-...-ispolzovanija вы почитали.
С БД немножко работать умеете, но я бы переписал:
Java
1
2
3
4
5
6
7
try {
    dbHelper = new DatabaseHelper(this, "mydatabase.db", null, 1);
    sdb = dbHelper.getReadableDatabase();
    ...
} finally {
    sdb.close();
}
Потому как в случае любых ошибок желательно не забыть закрыть соединение с БД (если дальше выполняется какая-то работа с базой).
R.layout.item - это, должно быть, разметка для строки списка. Надеюсь, у вас она есть, и там всё в порядке.
Подскажите, пожалуйста, корректно ли заполняется cursor (поглядите, сколько там записей).
Собственно, не знаю, где ещё могут быть ошибки. Статья https://thinkandroid.wordpress.com/2...and-listviews/ ничего нового не добавила.
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
17.05.2015, 07:48 #9
Цитата Сообщение от CoolMind Посмотреть сообщение
желательно не забыть закрыть соединение с БД
Можно спокойно забывать.
0
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
17.05.2015, 10:37  [ТС] #10
CoolMind, разметка лайаута литсвью:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="@drawable/fon">
 
    <ListView
        android:layout_width="83dp"
        android:layout_height="150dp"
        android:id="@+id/listView"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="200dp" />
 
    <TextView
        android:layout_width="180dp"
        android:layout_height="30dp"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="200dp"
        android:gravity="center_horizontal"
        android:textColor="#ff000000"
        android:textSize="20dp"
        android:text="Таблица оценок">
    </TextView>
 
    <TextView
        android:id="@+id/textView4"
        android:layout_width="234dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"
        android:layout_marginLeft="-420dp"
        android:textSize="20dp"
        android:textAppearance="?android:attr/textAppearanceLarge" />
 
    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:id="@+id/imageView3"
        android:contentDescription="@string/g_4"
        android:src="@drawable/set_g"
        android:layout_marginTop="30dp"
        android:layout_marginLeft="50dp"/>
    <Button
        android:layout_width="140dp"
        android:layout_height="40dp"
        android:id="@+id/button6"
        android:background="#ffffda70"
        android:text="@string/but_7"
        android:layout_marginLeft="-150dp"
        android:layout_marginTop="180dp"
        android:onClick="onClickReturn_sec" />
 
</LinearLayout>
и лэйаут с текствью:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
 
    <TextView
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
 
    <TextView
        android:id="@+id/tvMark"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="TextView" />
 
</LinearLayout>
Добавлено через 28 минут
И еще такой вопрос, - может кто знает как сохранять приложение на карте памяти, а не во внутреннюю память телефона при запуске через Андроид Студио?

Добавлено через 5 минут
Я проверяю работу приложения сразу на телефоне, а не на эмуляторе и в последнее время при запуске часто возникает такая ошибка:
pkg: /data/local/tmp/ua.example.tatiana.myapplication
Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]
0
Mikalai
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
17.05.2015, 11:34 #11
Как позволить установку приложения на карту памяти?
1
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
17.05.2015, 22:22  [ТС] #12
Если вдруг кому тоже нужно будет вот конкретный код для сохранения приложения на карту памяти:
Java
1
 android:installLocation="preferExternal"
Подробнее:
Java
1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    package="ua.example.tatiana.myapplication">
1
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
17.05.2015, 23:41 #13
Цитата Сообщение от Armagedo Посмотреть сообщение
Можно спокойно забывать.
Это в случае чтения. Если запись - то обязательно закрывать, иначе БД легко портится.
Цитата Сообщение от Rilina Посмотреть сообщение
Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]
Такое у меня часто бывало. Можно перезагрузить устройство.
Или использовать в AndroidManifest:
XML
1
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ua.example.tatiana.myapplication" android:installLocation="auto">
Этот вариант лучше предложенного выше, т.к. позволяет работать с эмулятором.

Добавлено через 1 минуту
Rilina, до сих пор не услышал, в каком месте ошибка.
Попробуйте использовать отладчик. Или планомерно комментируйте строки и смотрите, на какой приложение перестанет работать.
0
Rilina
4 / 4 / 0
Регистрация: 16.11.2013
Сообщений: 33
20.05.2015, 22:28  [ТС] #14
CoolMind, пробовала комментировать, ничего не понятно. Какой вариант с отладчиком? Что делать надо и как?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
21.05.2015, 09:44 #15
Rilina, вверху, рядом с зелёным треугольником, есть кнопка с изображением зелёного паучка. В свободное от работы время он плетёт паутину. Если к нему прикоснуться, запустится отладчик.
Перед вызовом надо найти какую-нибудь строчку в программе. Пускай это будет, например, строчка 20. Или 30, неважно. Слева от строчки есть вертикальный столбик, надо по нему щёлкнуть, и появится красный кружочек. А сама строчка выделится красной полосой. Так вот, запускаете букашку, она бегает и ищет, чего бы там сломать. А вы в это время можете наблюдать значения переменных. И чтобы перейти к следующему шагу, внизу появляется панель, в которой надо нажать кнопочку со стрелочкой.
2
21.05.2015, 09:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2015, 09:44
Привет! Вот еще темы с ответами:

Вывод массивов через ListView - Программирование Android
Добрый день, возникла такая проблема: есть два массива list и discribe, создается список через ListView пункты списка должны браться из...

Как правильно построить адаптер для показа данных из базы в ListView - Программирование Android
Всем привет. На данный момент все данные в программе хранятся в классе, есть адаптер для отображения данных в ListView: ArtsAdapter...

Вывод данных в список Listview - Программирование Android
Код: package com.example.projecta; import java.io.IOException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; ...

SQLite and ListView. Ввод и вывод данных - Программирование Android
Здравствуйте. Пишу программу(кто бы мог подумать). Есть подозрения, что данные в БД вбиваются не правильно или как раз выводятся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru