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

Обсуждение уроков
Аватара пользователя
adarash
Сообщения: 333
Зарегистрирован: 17 июл 2013, 09:59

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

Сообщение adarash » 04 мар 2014, 10:54

1. private static final int DATABASE_VERSION = 2;
2. onUpgrade не вижу.
3. имя базы смени на что-то типа "mdb.db" (у меня во всех проектах указано с расширение и с маленькой буквы. Проблем при таком формате не возникало ни разу.)

Я не пойму в чем у тебя ошибка, но выше список что я попробовал бы для решения проблемы. Начинай с конца списка(подозреваю что 3 пункт поможет).

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 04 мар 2014, 12:09

тю блин ну, ну возьми отладчик да пройди по шагам куда оно у тебя идет
И сразу бы нашел то, что у тебя код до строчки
dbHelper = new DBHelper(this);
не доходит, у тебя ж там ... стоит? скорее всего ты там обращаешься к бд, а ее нет еще.

Чего сидеть-то неделями?


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

...
dbHelper = new DBHelper(this);
dbHelper.dbInsert(TN_SPRACHEN,myTable);
...
}
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

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

Сообщение IriDolG » 11 мар 2014, 07:34

По какой-то причине приложение из урока не обрабатывает нажатия на кнопку (соответственно, не работает БД). Код скопировала верно.
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 11 мар 2014, 08:33

IriDolG писал(а):По какой-то причине приложение из урока не обрабатывает нажатия на кнопку (соответственно, не работает БД). Код скопировала верно.
"По какой-то причине я простоял сегодня на остановке полчаса (соответственно, замерз). На остановку пришёл как обычно."

Ну как из представленной информации сделать какой-либо вывод? =)
У других код работает. Сам лично не проверял, но увлеченных бд тут много людей вряд ли бы они это не заметили.
Почти уверен, что есть какая-то маленькая опечатка/недоделка в вашем коде. В конце концов понаставте логов и проверте, что обрабатывается, а что нет.

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

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

Сообщение IriDolG » 12 мар 2014, 04:32

Согласна, неумно с моей стороны...
Когда-нибудь я научусь!

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

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

Сообщение IriDolG » 12 мар 2014, 09:28

Вот код, как в уроке:

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

package comcc.exavmple.p0341_simplesqlite;


import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

  final String LOG_TAG = "myLogs";

  Button btnAdd, btnRead, btnClear;
  EditText etName, etEmail;

  DBHelper dbHelper;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnAdd = (Button) findViewById(R.id.btnAdd);
    btnAdd.setOnClickListener(this);

    btnRead = (Button) findViewById(R.id.btnRead);
    btnRead.setOnClickListener(this);

    btnClear = (Button) findViewById(R.id.btnClear);
    btnClear.setOnClickListener(this);

    etName = (EditText) findViewById(R.id.etName);
    etEmail = (EditText) findViewById(R.id.etEmail);
    
    // создаем объект для создания и управления версиями БД
    dbHelper = new DBHelper(this);
  }

  
  @Override
  public void onClick(View v) {
    
    // создаем объект для данных
    ContentValues cv = new ContentValues();
    
    // получаем данные из полей ввода
    String name = etName.getText().toString();
    String email = etEmail.getText().toString();

    // подключаемся к БД
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    

    switch (v.getId()) {
    case R.id.btnAdd:
      Log.d(LOG_TAG, "--- Insert in mytable: ---");
      // подготовим данные для вставки в виде пар: наименование столбца - значение
      
      cv.put("name", name);
      cv.put("email", email);
      // вставляем запись и получаем ее ID
      long rowID = db.insert("mytable", null, cv);
      Log.d(LOG_TAG, "row inserted, ID = " + rowID);
      break;
    case R.id.btnRead:
      Log.d(LOG_TAG, "--- Rows in mytable: ---");
      // делаем запрос всех данных из таблицы mytable, получаем Cursor 
      Cursor c = db.query("mytable", null, null, null, null, null, null);

      // ставим позицию курсора на первую строку выборки
      // если в выборке нет строк, вернется false
      if (c.moveToFirst()) {

        // определяем номера столбцов по имени в выборке
        int idColIndex = c.getColumnIndex("id");
        int nameColIndex = c.getColumnIndex("name");
        int emailColIndex = c.getColumnIndex("email");

        do {
          // получаем значения по номерам столбцов и пишем все в лог
          Log.d(LOG_TAG,
              "ID = " + c.getInt(idColIndex) + 
              ", name = " + c.getString(nameColIndex) + 
              ", email = " + c.getString(emailColIndex));
          // переход на следующую строку 
          // а если следующей нет (текущая - последняя), то false - выходим из цикла
        } while (c.moveToNext());
      } else
        Log.d(LOG_TAG, "0 rows");
      c.close();
      break;
    case R.id.btnClear:
      Log.d(LOG_TAG, "--- Clear mytable: ---");
      // удаляем все записи
      int clearCount = db.delete("mytable", null, null);
      Log.d(LOG_TAG, "deleted rows count = " + clearCount);
      break;
    }
    // закрываем подключение к БД
    dbHelper.close();
  }
  
  

  class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
      // конструктор суперкласса
      super(context, "myDB", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
      Log.d(LOG_TAG, "--- onCreate database ---");
      // создаем таблицу с полями
      db.execSQL("create table mytable ("
          + "id integer primary key autoincrement," 
          + "name text,"
          + "email text" + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }

}
Никаких опечаток, но не работает... Больше ведь никаких отдельно классов не нужно создавать?
Когда-нибудь я научусь!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 12 мар 2014, 10:26

тянете кота за хвост
"не работает" - мы тут такого не понимаем. Для урока не только нужно правильно скопировать куда-то код, но и выполнить ВСЕ, что сказано в уроке с самого начала.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 12 мар 2014, 10:41

IriDolG писал(а):Вот код, как в уроке:

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

package comcc.exavmple.p0341_simplesqlite;


import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

  final String LOG_TAG = "myLogs";

  Button btnAdd, btnRead, btnClear;
  EditText etName, etEmail;

  DBHelper dbHelper;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnAdd = (Button) findViewById(R.id.btnAdd);
    btnAdd.setOnClickListener(this);

    btnRead = (Button) findViewById(R.id.btnRead);
    btnRead.setOnClickListener(this);

    btnClear = (Button) findViewById(R.id.btnClear);
    btnClear.setOnClickListener(this);

    etName = (EditText) findViewById(R.id.etName);
    etEmail = (EditText) findViewById(R.id.etEmail);
    
    // создаем объект для создания и управления версиями БД
    dbHelper = new DBHelper(this);
  }

  
  @Override
  public void onClick(View v) {
    
    // создаем объект для данных
    ContentValues cv = new ContentValues();
    
    // получаем данные из полей ввода
    String name = etName.getText().toString();
    String email = etEmail.getText().toString();

    // подключаемся к БД
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    

    switch (v.getId()) {
    case R.id.btnAdd:
      Log.d(LOG_TAG, "--- Insert in mytable: ---");
      // подготовим данные для вставки в виде пар: наименование столбца - значение
      
      cv.put("name", name);
      cv.put("email", email);
      // вставляем запись и получаем ее ID
      long rowID = db.insert("mytable", null, cv);
      Log.d(LOG_TAG, "row inserted, ID = " + rowID);
      break;
    case R.id.btnRead:
      Log.d(LOG_TAG, "--- Rows in mytable: ---");
      // делаем запрос всех данных из таблицы mytable, получаем Cursor 
      Cursor c = db.query("mytable", null, null, null, null, null, null);

      // ставим позицию курсора на первую строку выборки
      // если в выборке нет строк, вернется false
      if (c.moveToFirst()) {

        // определяем номера столбцов по имени в выборке
        int idColIndex = c.getColumnIndex("id");
        int nameColIndex = c.getColumnIndex("name");
        int emailColIndex = c.getColumnIndex("email");

        do {
          // получаем значения по номерам столбцов и пишем все в лог
          Log.d(LOG_TAG,
              "ID = " + c.getInt(idColIndex) + 
              ", name = " + c.getString(nameColIndex) + 
              ", email = " + c.getString(emailColIndex));
          // переход на следующую строку 
          // а если следующей нет (текущая - последняя), то false - выходим из цикла
        } while (c.moveToNext());
      } else
        Log.d(LOG_TAG, "0 rows");
      c.close();
      break;
    case R.id.btnClear:
      Log.d(LOG_TAG, "--- Clear mytable: ---");
      // удаляем все записи
      int clearCount = db.delete("mytable", null, null);
      Log.d(LOG_TAG, "deleted rows count = " + clearCount);
      break;
    }
    // закрываем подключение к БД
    dbHelper.close();
  }
  
  

  class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context) {
      // конструктор суперкласса
      super(context, "myDB", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
      Log.d(LOG_TAG, "--- onCreate database ---");
      // создаем таблицу с полями
      db.execSQL("create table mytable ("
          + "id integer primary key autoincrement," 
          + "name text,"
          + "email text" + ");");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
  }

}
Никаких опечаток, но не работает... Больше ведь никаких отдельно классов не нужно создавать?
А логи хоть какие-то выводятся? в onClick отрабатывает? в onCreate к Хелперу заходит? Проверить на другом устройстве/эмуляторе нет возможности?

скопировал полностью ваш код, скопировал layout, запустил и... все работает. Странно это. Может у вас logcat заглючил или фильтры какие-то неправильные стоят?

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

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

Сообщение IriDolG » 12 мар 2014, 15:07

Логи тоже не выводятся. Проверяла на двух устройствах. А что за фильтры могут быть?
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 13 мар 2014, 06:18

IriDolG писал(а):Логи тоже не выводятся. Проверяла на двух устройствах. А что за фильтры могут быть?
Попробуйте выводить на экран (при нажатии кнопки read записывать текст куда-нить в TextView). Ну просто не должно быть проблем, код точно рабочий.

kirka_scant
Сообщения: 42
Зарегистрирован: 18 дек 2013, 14:54

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

Сообщение kirka_scant » 24 мар 2014, 07:34

Доброго времени суток!
У меня возникла проблема с методом ContentValues.put: когда я вношу в ContentValues два или три значения, то все в дальнейшем протекает успешно, но если я вношу туда 4 или более значений, то почему-то ContentValues отображает ключи и значения не в том порядке, в котором я их туда закладывал.
Думаю, что в связи с этим метод SQLiteDataBase.insert возвращает -1 и Cursor.getColumnIndex также возвращает -1.
Кто-нибудь знает почему ContentValues самостоятельно меняет (возможно, сортирует по какому-либо признаку) местами мои данные? Как это устранить?
Буду благодарен любому ответу.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 24 мар 2014, 10:41

kirka_scant писал(а):Доброго времени суток!
У меня возникла проблема с методом ContentValues.put: когда я вношу в ContentValues два или три значения, то все в дальнейшем протекает успешно, но если я вношу туда 4 или более значений, то почему-то ContentValues отображает ключи и значения не в том порядке, в котором я их туда закладывал.
Думаю, что в связи с этим метод SQLiteDataBase.insert возвращает -1 и Cursor.getColumnIndex также возвращает -1.
Кто-нибудь знает почему ContentValues самостоятельно меняет (возможно, сортирует по какому-либо признаку) местами мои данные? Как это устранить?
Буду благодарен любому ответу.
кто его знает что вы там делаете, где-то ошиблись.
код и доказательства (логи) в студию.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 07 апр 2014, 23:45

Как получить доступ к таблице mytable в другой активити? Какой контекст у DBHelper в другой активити?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 08 апр 2014, 07:00

Digetix писал(а):Как получить доступ к таблице mytable в другой активити? Какой контекст у DBHelper в другой активити?
viewtopic.php?f=34&t=3822
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Pu1s
Сообщения: 16
Зарегистрирован: 21 апр 2014, 02:08

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

Сообщение Pu1s » 21 апр 2014, 02:13

Как исправить ошибку
Код:
case R.id.btnRead:
Log.d(LOG_TAG, "--- Row in mytable: ---");
//далее запрос всех данных из таблици mytable. получаем Cursor
Cursor c = db.query("mytable", null, null, null, null, null, null);

//ставим курсор на первую строку выборки
//если в выборке нет текстаб вставляется false
if (c.moveToFirst()) {

//определяем номер столбца по имени в выборке
int idColIndex = c.getColumnIndex("Id");
int kod_productColIndex = c.getColumnIndex("kod_product");
int name_productColIndex = c.getColumnIndex("name_product");
int price_productColIndex = c.getColumnIndex("price_product");
int price_product_sellColIndex = c.getColumnIndex("price_product_sell");

do {
//получаем значение по номеру столбца и пишем все в лог
Log.d(LOG_TAG,
"Id = " + c.getInt(idColIndex) +
"kod_product = " + c.getString(kod_productColIndex) +
"name_product = " + c.getString(name_productColIndex) +
"price_product = " + c.getString(price_productColIndex) +
"price_product_sell = " + c.getString(price_product_sellColIndex));
//переходим на следующую строку
//а если следующей нет, то false - выходим из цикла
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "0 rows");
c.close();
break;



лог:
Изображение

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 апр 2014, 11:25

Вообще не там ошибку ищешь!
Посмотри ссылку в подписи. Ошибка другая, но способ нахождения - тот же.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Pu1s
Сообщения: 16
Зарегистрирован: 21 апр 2014, 02:08

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

Сообщение Pu1s » 21 апр 2014, 14:43

Спасибо за ответ. Но не помогло... Я вижу, что проблема в курсор. Поэтому и выставил лог там где о нем написано. Кнопка ввода в бд работает, кнопка удалить тоже. А проблема именно с чтением. И прежде чем задать вопрос тут, воспользовался гуглом. Я не задаю вопрлсов до того, пока сам не попробую найти ответ.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 апр 2014, 14:53

на какую именно строку указывает лог?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Pu1s
Сообщения: 16
Зарегистрирован: 21 апр 2014, 02:08

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

Сообщение Pu1s » 21 апр 2014, 17:35

Как я понял он ругается на

Cursor c = db.query("mytable", null, null, null, null, null, null);

или на

if (c.moveToFirst()) {

Как написанно в логе, он не может прочесть строку 0, колонка -1. А вот почему это,я не пойму. Если не сложно, то поясните почему он так пишет.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 апр 2014, 17:44

или - не или
точную строку!
по ссылке в моей подписи написано как ее ТОЧНО найти. Никаких "приблизительно-или" в программировании нет.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Ответить