Урок 34. Хранение данных. SQLite

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 13 окт 2012, 00:22

Что то не совсем понятен вопрос. При загрузке первой активити открывайте бд, делайте query, получаете Cursor который в цикле прогоняете и при каждом проходе делайте product.add(new Product( ??? , R.drawable.unread)).
R.id.team
Политика на форуме запрещена

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 07:09

Вообщем, (не) получается следующим образом. Есть метод fillData c постоянными позициями

Код: Выделить всё

// генерируем постоянные данные для адаптера
    void fillData() {

        product.add(new Product("Product_1 ", R.drawable.unread));
        product.add(new Product("Product_1 ", R.drawable.unread));
        product.add(new Product("Product_1 ", R.drawable.unread));
    }
а также метод db ShowAll с вызовом сперва метода fillData(), а затем загрузкой данных из БД

Код: Выделить всё

    void dbShowAll() {
       
        fillData();
        // подключаемся к базе данных             
        db = dbHelper.getWritableDatabase();
        // получаем значения и отображаем при загрузке приложения
        c = db.query("mytable", null, null, null, null, null, null);

        if (c != null) {
        if (c.moveToFirst()) {
       
            nameColIndex = c.getColumnIndex("name");
            do {
              String str = c.getString(nameColIndex);
              product.add(new Product(str, R.drawable.unread));
            } while (c.moveToNext());
      }             
        } else {
        Log.d(LOG_TAG, "Cursor is null");
        c.close();
        dbHelper.close();
    }
}   
При загрузке такой конструкции дает следующую ошибку:

03:54:57.590 620 example.CustomAdapter ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{example.CustomAdapter/example.CustomAdapter.MainActivity}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed

Спасибо.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 13 окт 2012, 10:51

dil_android писал(а):При загрузке такой конструкции дает следующую ошибку:

03:54:57.590 620 example.CustomAdapter ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{example.CustomAdapter/example.CustomAdapter.MainActivity}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
На какой именно строке происходит исключение?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 11:00

Я даже не знаю в NetBeans LogCat строки не показывает. Может я просто не знаю как настроить.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 13 окт 2012, 11:50

В эклипсе, при двойном клике по сообщению, курсор автоматически переходит на нужную строку. Скорее всего в NetBeans это тоже должно сработать.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 12:14

Двойным кликом открывает только классы в android.app

Скорее всего ошибка

09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.database.CursorWindow.getString_native(Native Method)

Как добавить скриншот к моему сообщению? :oops:

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 12:15

09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime FATAL EXCEPTION: main
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime java.lang.RuntimeException: Unable to start activity ComponentInfo{example.CustomAdapter/example.CustomAdapter.MainActivity}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:99)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.os.Looper.loop(Looper.java:123)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:3683)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:507)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at dalvik.system.NativeStart.main(Native Method)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.database.CursorWindow.getString_native(Native Method)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.database.CursorWindow.getString(CursorWindow.java:329)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at example.CustomAdapter.MainActivity.dbShowAll(MainActivity.java:322)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at example.CustomAdapter.MainActivity.onCreate(MainActivity.java:111)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
09:05:57.826 1805 example.CustomAdapter ERROR AndroidRuntime ... 11 more
09:05:57.520 1805 example.CustomAdapter DEBUG AndroidRuntime Shutting down VM
09:05:57.520 1805 example.CustomAdapter WARN dalvikvm threadid=1: thread exiting with uncaught exception (group=0x40015560)
09:05:57.359 1805 example.CustomAdapter ERROR CursorWindow Bad request for field slot 0,-1. numRows = 2, numColumns = 3

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 12:27

Я мог бы отправить "свое произведение" txt файлом на личку, с Вашего позволения.
Мне кажется, посмотрев, ошибку найти было бы легче.
Мой адрес dil_android@mail.ru

Спасибо

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 13 окт 2012, 12:38

почему бы дебагером не пройтись и узнать что где вылетает?
R.id.team
Политика на форуме запрещена

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 13 окт 2012, 12:40

Не нужно ничего присылать. Ошибка в строке с getString. Проверьте, правильно ли Вы указали имя колонки в getColumnIndex.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 13 окт 2012, 12:58

Так и подмывает спросить "дяденька, а как вы это сделали"?
Если серьезно, можно расшифровку фокуса-покуса, хотя бы в общем, для расширения собственных знаний.
Весь вопрос был только в одной букве s в names.

Спасибо большое.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 14 окт 2012, 04:14

dil_android писал(а):"дяденька, а как вы это сделали"?
Если читать снизу вверх можно заметить цепочку методов которая вызывает ошибку. Оибку определить можно было сразу по строке "get field slot from row 0 col -1 failed". В ней говорится, что не удалось получить поле из 0 строки -1 колонки, а у колонки индекс -1 бывает только если такой колонки не существует.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 14 окт 2012, 04:57

Понял, спасибо за разъяснение. Сразу, пока не остыло, хочу спросить еще вот о чем. Как увязать id даваемое вводимым данным с id пункта списка, чтобы при удалении удалять именно ту позицию в базе данных, которую выбрал в списке.
А именно, реализовать в следующем:

Код: Выделить всё

            if (item.getItemId() == CM_DELETE_ID) {
                // получаем инфу о пункте списка                    
                AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

// подключаемся к базе данных             
db = dbHelper.getWritableDatabase();

if (c != null) {
//удаление текущей позиции из базы данных
Log.d(LOG_TAG, "--- Delete from mytabe: ---");
// удаляем 
int delCount = db.delete("mytable", "id = " + acmi.id, null);          ????

Log.d(LOG_TAG, "row deleted, ID = " + rowID);
Log.d(LOG_TAG, "MainActivity deleted row, ID = " + acmi.id);
Log.d(LOG_TAG, "deleted rows count = " + delCount);
} else {
    Log.d(LOG_TAG, "Cursor is null");
    c.close();
}
    dbHelper.close();
 // уведомляем, что данные изменились
myAdapter.notifyDataSetChanged();
return true;
Вопрос для меня важен, потому, что хочу использовать одну БД для двух списков. Насколько я понял, такое возможно, и даже приветствуется с точки зрения оптимизации. Может, существует какой-то маркер?

Спасибо.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 15 окт 2012, 12:11

Здравствуйте,

Провозившись весь день, пришел к выводу, что в принципе делаю что-то не верно. Взяв за основу пример из Урока 54, где создается свой адаптер на основе BaseAdapter, а данные загружаются из ArrayList<Product>, я хочу включить в свою программу базу данных SQLite, в которую закладываю получаемые из вне значения, и, через которую product.add(new Product(names, R.drawable.unread));стараюсь пополнить ArrayList<Product>.
Отсюда, предыдущий вопрос о возможности синхронизации id данных.
Подскажите пожалуйста, прав ли я в своих сомнениях?

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 15 окт 2012, 12:26

В дополнение. Обращение к SQLite было вызвано желанием сохранять все вновь вводимые данные с тем, чтобы они отображались при каждой новой загрузке, т.е., чтобы программа была динамичной. Когда пытался сделать это через Prefrences не получилось. Подскажите как быть, а то чувствую, что путаюсь.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 34. Хранение данных. SQLite

Сообщение rezak90 » 15 окт 2012, 13:00

вы путаетесь, и я вместе с вами))) И так в чём собственно проблема? Запустилась приложуха, вытянули из бд данные, заполнили ими listview. Что именно не понятно?
R.id.team
Политика на форуме запрещена

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 34. Хранение данных. SQLite

Сообщение powercat » 15 окт 2012, 14:26

dil_android писал(а):Понял, спасибо за разъяснение. Сразу, пока не остыло, хочу спросить еще вот о чем. Как увязать id даваемое вводимым данным с id пункта списка, чтобы при удалении удалять именно ту позицию в базе данных, которую выбрал в списке.
А именно, реализовать в следующем:

Код: Выделить всё

            if (item.getItemId() == CM_DELETE_ID) {
                // получаем инфу о пункте списка                    
                AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

// подключаемся к базе данных             
db = dbHelper.getWritableDatabase();

if (c != null) {
//удаление текущей позиции из базы данных
Log.d(LOG_TAG, "--- Delete from mytabe: ---");
// удаляем 
int delCount = db.delete("mytable", "id = " + acmi.id, null);          ????

Log.d(LOG_TAG, "row deleted, ID = " + rowID);
Log.d(LOG_TAG, "MainActivity deleted row, ID = " + acmi.id);
Log.d(LOG_TAG, "deleted rows count = " + delCount);
} else {
    Log.d(LOG_TAG, "Cursor is null");
    c.close();
}
    dbHelper.close();
 // уведомляем, что данные изменились
myAdapter.notifyDataSetChanged();
return true;
Вопрос для меня важен, потому, что хочу использовать одну БД для двух списков. Насколько я понял, такое возможно, и даже приветствуется с точки зрения оптимизации. Может, существует какой-то маркер?

Спасибо.
Тебе вроде бы надо это
viewtopic.php?f=34&t=1120

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 15 окт 2012, 15:17

rezak90

Спасибо за желание помочь. Чтобы не загромождать своими объяснениями форум, я скинул Вам на личку.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 34. Хранение данных. SQLite

Сообщение dil_android » 15 окт 2012, 15:32

to powercat

Сейчас у меня на повестке два основных вопроса, решение которых позволит запустить приложение - это передача данных с Activity и динамическое обновление списка, сохраняя и удаляя в БД. Спасибо за ссылку, но надо сперва разобраться с БД. У меня такое ощущение, что делают что-то не так, именно с точки зрения логики программирования. К сожалению нет возможности обратиться к кому-либо с просьбой посмотреть код, кроме как к участникам этого форума. Любая помощь, и особенно критика, будут восприняты с благодарностью.

Еще раз спасибо.

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Урок 34. Хранение данных. SQLite

Сообщение powercat » 15 окт 2012, 16:45

я так понял, что ты хочешь удалить пункт списка, чтобы при этом произошло удаление по id в базе и перепостроение списка?
Если так, то моя ссыль - именно это решение, у меня была именно эта проблема.

А код...ну запость сюда все коды...думаю, народ поймет...

Ответить