Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
1

SimpleCursorAdapter не хочет работать

28.04.2017, 01:54. Просмотров 1047. Ответов 18
Метки нет (Все метки)

Добрый день.
Вобщем такая ситация. Нажимаю на MainActivity кнопку и по интенту грузится вторая актвити
ее код:
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
public class HistoryActivity extends Activity {
    ListView listView;
    Cursor cursor;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_history);
 
        listView = (ListView) findViewById(R.id.listView); // он должен заполнится из базы данных
 
        DataBase dataBase = new DataBase(this);
        final SQLiteDatabase sqLiteDatabase = dataBase.getWritableDatabase();
 
 
        String[] from = new String[]{"searchWord", "searchLang"};  пишу поля которые мне нужны для отображения- я так это понял
        int[] to = new int[]{R.id.searchText, R.id.translated}; // пишу id куда должны вставится поля описаные выше
 
        cursor = sqLiteDatabase.query("history", null, null, null, null, null, null); // получаю курсор
        startManagingCursor(cursor);
 
 
        // создаю адаптер 
        SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to);
 
           // прикрепляю адаптер      
        listView.setAdapter(simpleCursorAdapter);
    }
класс БД :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class DataBase extends SQLiteOpenHelper {
    public DataBase(Context context) {
        super(context, "db", null, 1);
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table history(_id integer primary key autoincrement,searchWord text,searchLang text,translatedWord text,translatedLang text)");
        Log.d("bd","create");
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
    }
}
и при загрузке активити приложение вылетает с ошибко:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime: FATAL EXCEPTION: main
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime: Process: com.example.ya, PID: 16134
04-27 18:44:53.988 16134-16134/com.example.ya E/Androi[B]dRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ya/com.example.ya.Activities.HistoryActivity}: java.lang.IllegalArgumentException: column '_id' does not exist[/B]
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
04-27 18:44:53.988 16134-16134/com.example.ya E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2017, 01:54
Ответы с готовыми решениями:

Не хочет работать программа, что делать? Android Studio + VK API
Сделал программу в Android Studio, использовал VK api. Вроде бы, авторизация должна работать. Я...

SimpleCursorAdapter
Почему то ругаетсяв строке new SimpleCursorAdapter()... Что не так делаю? Cursor cursor =...

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

Фильтрация в кастомном SimpleCursorAdapter
Здравствуйте. вот Активити public class MainActivity extends AppCompatActivity { ...

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

18
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 06:06 2
werrt, так ли сложно найти в логе строчку где написано что столбец _id не существует?
1
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 10:23  [ТС] 3
vxg, вот именно что он существует.
0
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 10:54 4
werrt, я вижу что вы в конструкторе создаете таблицу и вроде как там есть этот столбец, но лог говорит обратное. может таблица уже есть, она без этого столбца и запрос просто игнорируется? или SQLite как то декорирует _id?
1
ExFau$t
686 / 575 / 133
Регистрация: 08.05.2012
Сообщений: 2,834
28.04.2017, 11:10 5
Может глупость скажу, я уже помню почему, но по привычке все запросы в sql всегда писал в верхнем регистре. А после запроса, вроде как, до закрытия кавычки ставится точка с запятой.
1
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 11:20  [ТС] 6
если после создания курсора сразу пишу
Java
1
2
3
4
5
6
7
8
9
10
11
12
 if (cursor.moveToFirst()) {
 
            while (cursor.moveToNext()) {
 
                System.out.println(cursor.getInt(cursor.getColumnIndex("id")));
                System.out.println(cursor.getString(cursor.getColumnIndex("searchWord")));
                System.out.println(cursor.getString(cursor.getColumnIndex("searchLang")));
                System.out.println(cursor.getString(cursor.getColumnIndex("translatedWord")));
                System.out.println(cursor.getString(cursor.getColumnIndex("translatedLang")));
 
            }
        }
все отлично выводится в консоль.
все вылетает на строке

SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.item, cursor, from, to);
0
ExFau$t
686 / 575 / 133
Регистрация: 08.05.2012
Сообщений: 2,834
28.04.2017, 11:34 7
Ну а если в конец конструктора адаптера дописать 0?
1
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 11:38 8
werrt, примечательно что тут уже не _id а id хотя может это просто эволюция кода
1
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 11:42  [ТС] 9
ExFau$t, пробовал не помогло (

Добавлено через 2 минуты
vxg, c _id не читает. сразу ошибка Failed to read row 1, column -1 from a CursorWindow which has 24 rows, 5 columns.
0
ExFau$t
686 / 575 / 133
Регистрация: 08.05.2012
Сообщений: 2,834
28.04.2017, 11:42 10
А что в методе startManagingCursor? И что если в конструкторе курсора вытаскивать искомые столбцы вторым параметром.
1
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 11:51  [ТС] 11
ExFau$t, пробовал и так
cursor = sqLiteDatabase.query("history", new String[]{"id","searchWord", "searchLang","translatedWord","translatedLang"}, null, null, null, null, null);
startManagingCursor что типа авто закрытия курсора... без него тож не идет
0
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
28.04.2017, 12:43 12
Лучший ответ Сообщение было отмечено werrt как решение

Решение

werrt, я наверное спрошу очевидные вещи - может вы сначала установили приложение, а потом в коде добавили столбец _id?
Метод onCreate для БД срабатывает только один раз, во время установки.
Попробуйте удалить и переустановить ваше приложение.
1
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 12:49 13
werrt, ну значит _id нету, дайте ему id
fraley, можно обойтись очисткой данных
0
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 12:51  [ТС] 14
fraley,
да, сначало писал без БД, соотсветсвенно и на эмуляторе было установленео ранее- не знал таких тонкостей. Деинсталировал. Вроде пошло )
1
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
28.04.2017, 13:05 15
vxg, имхо, проще удалить, чем лезть в настройки.
0
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 13:43 16
fraley, кнопка удалить рядом с кнопкой очистить или я чего то не знаю?
0
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
28.04.2017, 13:58 17
vxg, если нажать эту кнопку, откроются все приложения установленные на телефоне.
Выбираешь приложение, тыцаешь на него и удерживаешь. Наверху появляется корзина(Uninstall) в которую и перетаскиваешь приложение.
По такому же принципу и на реальном телефоне.
1
Миниатюры
SimpleCursorAdapter не хочет работать  
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
28.04.2017, 14:06 18
fraley, а, точно, вспомнил, просто никогда их так не удалял, спс
0
werrt
4 / 4 / 4
Регистрация: 07.02.2008
Сообщений: 348
28.04.2017, 15:51  [ТС] 19
а как сделать чтобы если в какой то строке пустой столбец, то строка бы не отображалась в списке.
Создал для этого свой адаптор, но в каком методе проверку и какую не понял
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
public class HistoryItemAdaptor extends SimpleCursorAdapter {
 
    private int layout;
 
    public HistoryItemAdaptor(Context context, int _layout, Cursor c, String[] from, int[] to) {
        super(context, _layout, c, from, to);
        layout=_layout;
 
    }
 
    @Override
    public View newView(Context _context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) _context.getSystemService(_context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(layout, parent, false);
        return view;
    }
    @Override
    public void bindView(View view, Context _context, Cursor _cursor) {
        String searchWord = _cursor.getString(_cursor.getColumnIndex("searchWord"));
        String searchLang=_cursor.getString(_cursor.getColumnIndex("searchLang"));
        String translatedWord=_cursor.getString(_cursor.getColumnIndex("translatedWord"));
        String translatedLang=_cursor.getString(_cursor.getColumnIndex("translatedLang"));
 
        TextView searchWordView = (TextView) view.findViewById(R.id.searchTextView);
        TextView searchLangView = (TextView) view.findViewById(R.id.searchLangView);
        TextView translatedWordView = (TextView) view.findViewById(R.id.translatedWordView);
        TextView translatedLangView = (TextView) view.findViewById(R.id.translatedLangView);
 
        searchWordView.setText(searchWord);
        searchLangView.setText(searchLang);
        translatedWordView.setText(translatedWord);
        translatedLangView.setText(translatedLang);
 
    }
хотел в bindView но не сработало как надо.

или это надо в Курсоре как то описывать,?

Добавлено через 49 минут
точно курсор нужно изменить
0
28.04.2017, 15:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2017, 15:51

Каков новый аналог устаревшего SimpleCursorAdapter?
SimpleCursorAdapter устарел уже(deprecated) что лучше использовать вместо него какой есть более...

ViewPager, Fragment и SimpleCursorAdapter, обновить соседнюю страницу
Есть активити с ViewPager, в который подгружается фрагмент, состоящий из ListView. ListView (с...

Вывод из базы данных в ListView через SimpleCursorAdapter
Доброе время суток. Пишу программу под Андроид в среде Android Studio и возникла проблема с...


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

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

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