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

Обсуждение уроков
Shelest
Сообщения: 3
Зарегистрирован: 12 ноя 2017, 17:04

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

Сообщение Shelest » 12 ноя 2017, 17:12

А почему у меня в file explorer не открывается папка data?

Vikg
Сообщения: 1
Зарегистрирован: 25 июн 2018, 20:32

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

Сообщение Vikg » 28 июн 2018, 18:44

Я извиняюсь, но я не могу повторить код урок 34 ! хоть стреляйся !
уже несколько раз переписывал урок !! на разных ноутбуках и с разными версиями Android Studio !

Еще дико извиняюсь !! Осваиваю Андроид ! Начинал с СМ2М на мнемокоде в 1980г.


Выкладываю -
Activity , DBHelper и Blog отладки :

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    public final String LOG_TAG = "myLogs";

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

    DBHelper dbHelper;

    @Override
    protected 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();
        /*    ContentValues contentValues = 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(DBHelper.KEY_NAME, name);
                cv.put(DBHelper.KEY_MAIL, email);
      
                // вставляем запись и получаем ее ID
                /*       long rowID = db.insert("mytable", null, cv); */
                db.insert(DBHelper.TABLE_CONTACTS,null,cv);

                Log.d(LOG_TAG, "row inserted, ID = " );
                /*   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(DBHelper.TABLE_CONTACTS, null, null, null, null, null, null);
               
                // ставим позицию курсора на первую строку выборки
                // если в выборке нет строк, вернется false
                if (c.moveToFirst()) {

                    // определяем номера столбцов по имени в выборке
                    int idColIndex = c.getColumnIndex(DBHelper.KEY_ID);
                    int nameColIndex = c.getColumnIndex(DBHelper.KEY_NAME);
                    int emailColIndex = c.getColumnIndex(DBHelper.KEY_MAIL);

                  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(DBHelper.TABLE_CONTACTS, null, null);
                                Log.d(LOG_TAG, "deleted rows count = " + clearCount);
                break;
        }
        dbHelper.close();
    }
}


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

public class DBHelper extends SQLiteOpenHelper{

    public final String LOG_TAG = "myLogs";


    public static final int DATABASE_VER = 1;
    public static final String DATABASE_NAME = "contactDb";
    public static final String TABLE_CONTACTS = "contacts";

    public static final String KEY_ID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_MAIL = "mail";

    public DBHelper(Context context)    {


       super(context, DATABASE_NAME, null, DATABASE_VER );
     /*  super(context, TABLE_CONTACTS, null, DATABASE_VER ); */
   /*    super(context, "mytable", null,1 ); */

    }

    public SQLiteDatabase getWritableDatabase() { return null ; }

    public void close() {

    }
    @Override
    public void onCreate(SQLiteDatabase db) {

        Log.d(LOG_TAG," ...onCreate database...");

       db.execSQL("create table " + TABLE_CONTACTS + "(" + KEY_ID
                + " integer primary key," + KEY_NAME + " text,"
                + KEY_MAIL + " text" + ")");

     /*   db.execSQL("create table mytable ("
                + " integer primary key autoincrement,"
                + " integer primary key,"
                + " name text,"
                + " email text" + ")"); */

    }

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

        db.execSQL("drop table if exists " + TABLE_CONTACTS);

        onCreate(db);    }
}

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

E/BinaryDictionaryGetter: Could not find a dictionary pack
E/ActivityThread: Failed to find provider info for com.android.inputmethod.latin.dictionarypack
D/myLogs: --- Insert in mytable: ---
D/AndroidRuntime: Shutting down VM
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa61b0908)
E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.NullPointerException
        at com.example.vikg.mylesson.MainActivity.onClick(MainActivity.java:67)
        at android.view.View.performClick(View.java:4204)
        at android.view.View$PerformClick.run(View.java:17355)
        at android.os.Handler.handleCallback(Handler.java:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager:   Force finishing activity com.example.vikg.mylesson/.MainActivity
D/genymotion_audio: out_write: pcm_write() with out_frames=558 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/dalvikvm: GC_FOR_ALLOC freed 200K, 25% free 6240K/8244K, paused 40ms, total 42ms
I/dalvikvm-heap: Grow heap (frag case) to 7.283MB for 1127532-byte allocation
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/dalvikvm: GC_FOR_ALLOC freed 1K, 22% free 7339K/9348K, paused 40ms, total 40ms
D/genymotion_audio: out_write: pcm_write() with out_frames=558 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=558 frame_size=4 returned -EPIPE
D/dalvikvm: GC_CONCURRENT freed 40K, 21% free 7440K/9348K, paused 2ms+1ms, total 346ms
W/ActivityManager: Activity pause timeout for ActivityRecord{532c9858 u0 com.example.vikg.mylesson/.MainActivity}
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
I/qtaguid: Failed write_ctrl(s 1 10023) res=-1 errno=1
W/NetworkManagementSocketTagger: setKernelCountSet(10023, 1) failed with errno -1
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
W/EGL_genymotion: eglSurfaceAttrib not implemented
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=558 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=557 frame_size=4 returned -EPIPE
D/genymotion_audio: out_write: pcm_write() with out_frames=558 frame_size=4 returned -EPIPE


Seiko
Сообщения: 1
Зарегистрирован: 30 апр 2019, 19:45

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

Сообщение Seiko » 30 апр 2019, 20:02

Здравствуйте.
Не могу понять, почему в логах не отображаются буквы, которые ввожу в поля EditText. Цифры все нормально пишет, а буковки совсем не пишет..
Не работает именно когда нажимаю кнопку "read". Т.е. при добавлении, он показывает, что я ввожу, а при чтении почему-то буквы не отображает. Подскажите, пожалуйста, в чем дело! :roll:

Vsiniak
Сообщения: 8
Зарегистрирован: 03 авг 2020, 10:30

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

Сообщение Vsiniak » 13 авг 2020, 15:08

Seiko писал(а):
30 апр 2019, 20:02
Здравствуйте.
Не могу понять, почему в логах не отображаются буквы, которые ввожу в поля EditText. Цифры все нормально пишет, а буковки совсем не пишет..
Не работает именно когда нажимаю кнопку "read". Т.е. при добавлении, он показывает, что я ввожу, а при чтении почему-то буквы не отображает. Подскажите, пожалуйста, в чем дело! :roll:
Может неправильный метод вызываешь у Cursor. Метод должен быть getString.
Обращайтесь в ЛС. Помогу.

Vsiniak
Сообщения: 8
Зарегистрирован: 03 авг 2020, 10:30

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

Сообщение Vsiniak » 14 авг 2020, 09:13

Тезисно извлек для себя из этого урока:
Класс-обработчик БД наследует класс SQLiteOpenHelper.
onCreate – метод, вызывается если БД, к которой мы хотим подключиться не существует.
onUpgrade – метод, вызывается если мы хотим подключиться к БД более новой версии, чем существующая.
ContentValues – создает объект для данных.
Contenvalues.put(“имя поля”, значение)
Подключение к БД
SQLiteDatabase db = dbHelper.getWritableDatabase();

Класс DBHendler наследует SQLiteOpenHelper.
Добавить данные в БД.
db.insert("mytable", null, contentValues);
Удалить данные из БД
db.delete("mytable", null, null);
Чтение данных из БД
db.query("mytable", null, null, null, null, null, null);
Прочитав данные, добавляем их в Cursor
Cursor c = db.query("mytable", null, null, null, null, null, null);
Ставим указатель на первую запись
c.moveToFirst()
Получаем индексы столбцов по именам
c.getColumnIndex
Вывод данных по индексу
c.getString(nameColIndex)
Перебор данных из Cursor
c.moveToNext()
Закрытие курсор
c.close();
В методе onCreate, класса DBHelper создаем таблицу с полями.
sqLiteDatabase.execSQL("create table mytable ("
+ "id integer primary key autoincrement,"
+ "name text,"
+ "email text" + ");");
Обращайтесь в ЛС. Помогу.

Rolik
Сообщения: 14
Зарегистрирован: 05 апр 2021, 06:42

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

Сообщение Rolik » 20 май 2021, 20:53

Как же я ненавижу вложенные классы ... :evil:
Вот, обязательно было DBHelper внутрь пихать ? А с геттерами слабо ??

Ответить