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

Обсуждение уроков
AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

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

Сообщение AlexeyFedor » 22 мар 2015, 12:41

Как перезагрузить базу данных и курсор?
Вот к примеру такой кусок кода. Из базы данных удаляется строчка. Как сделать перезагрузку базы и курсора.

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

case R.id.btnDellRec:
            int idColumn=cur.getColumnIndex("_id");
            int idRecordforDell=cur.getInt(idColumn);//вытаскиваем ID записи которую удаляем
            int posCur=cur.getPosition();//запоминаем позицию курсора
            //удаляем выбранную запись
            db.delete("dictonary", "_id=?",  new String[] { String.valueOf(idRecordforDell)});
            //закрываем базу
            cur.close();
            db.close();
            dictDB.close();
            //все заново открываем
            dictDB=new DictonaryDB(this);
            db = dictDB.getWritableDatabase();
            cur=db.query("dictonary", null, null, null, null, null, null);
            if(!cur.moveToPosition(posCur) ){ //ставим позицию курсора если такой нет то на первую позицию
                cur.moveToFirst();
            }
            //отправляем обратно позицию курсора в родительское активити
            intent.putExtra("curPosition", cur.getPosition());
            setResult(RESULT_OK, intent);
            onCloseDB();
            finish();
            break;
Пока делаю так. Сам вижу, что коряво. Пока все как то через сидалище, сперва все закрывается, потом все открывается, чтобы не нарваться на несуществующую позицию курсора. Есть какой нить способ поэлегантнее?

Sasha2dx
Сообщения: 51
Зарегистрирован: 10 апр 2015, 23:24

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

Сообщение Sasha2dx » 19 апр 2015, 02:52

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

package com.sasha2dx.savesomewithsqllite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

    EditText textInput;
    TextView textOutput;
    DBHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textInput = (EditText)findViewById(R.id.textInput);
        textOutput = (TextView)findViewById(R.id.textOutput);
        dbHelper = new DBHelper(this);

    }


    public void onClick(View v) {

        /** создаем объект для данных*/
        ContentValues cv = new ContentValues();
        /** получаем данные из полей ввода*/
        String saved = textInput.getText().toString();
        /** подключаемся к БД*/
        SQLiteDatabase db = dbHelper.getWritableDatabase();        
        String allText="";


        switch (v.getId()) {
            case R.id.buttonSave:
                cv.put("saved", saved);
                break;


            case R.id.buttonLoad:
                /** делаем запрос всех данных из таблицы mytable, получаем Cursor*/
                Cursor c = db.query("mytable", null, null, null, null, null, null);
                /** ставим позицию курсора на первую строку выборки
                    если в выборке нет строк, вернется false*/
                if (c.moveToFirst()) {

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

                    do {
                        // получаем значения по номерам столбцов и пишем все в String
                        allText = (allText + c.getInt(idColIndex) +".)  " + c.getString(savedColIndex) +"\n\n");
                        // переход на следующую строку
                        // а если следующей нет (текущая - последняя), то false - выходим из цикла
                    }
                    while (c.moveToNext());
                    textOutput.setText(allText);
                }
                else
                    textOutput.setText("Нет сохранённых данных.");
                c.close();
                break;

        }
        // закрываем подключение к БД
        dbHelper.close();
    }


    class DBHelper extends SQLiteOpenHelper {

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

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table mytable ("+ "id integer primary key autoincrement,"+"saved text"+ ");");
        }

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

        }
    }


}
Переделал немного код с урока..приложение не работает, при попытке сохранить текст или прочитать - выдаёт ошибку и закрывается, помогите нубу разобратся. D: Мне кажется метод onCreate не может создать бд, но .... почему?

upd
Всё...разобрался уже во всём самостоятельно.

Радислав Гандопас
Сообщения: 9
Зарегистрирован: 29 апр 2015, 09:47

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

Сообщение Радислав Гандопас » 12 май 2015, 10:32

Объясните пожалуйста кто-нибудь что-то не понимаю этого.

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

 SQLiteDatabase db = dbHelper.getWritableDatabase();
В этой строке получили объект класса SQLiteDatabase;

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

 Cursor c = db.query("mytable", null, null, null, null, null, null);
В этой получили объект класса Cursor.

Почему при создании этих объектов мы не использовали оператор new, как обычно это делали т.е. например вот так

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

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

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 12 май 2015, 10:50

Радислав Гандопас писал(а):Объясните пожалуйста кто-нибудь что-то не понимаю этого.

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

 SQLiteDatabase db = dbHelper.getWritableDatabase();
В этой строке получили объект класса SQLiteDatabase;

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

 Cursor c = db.query("mytable", null, null, null, null, null, null);
В этой получили объект класса Cursor.

Почему при создании этих объектов мы не использовали оператор new, как обычно это делали т.е. например вот так

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

Cursor c = new Cursor();
c =db.query("mytable", null, null, null, null, null, null); 
new вызывается для конструктора, если нью не стоит значит это обычный метод, который возвращает готовый объект (сам создает или берет готовый откуда-то еще).
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Радислав Гандопас
Сообщения: 9
Зарегистрирован: 29 апр 2015, 09:47

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

Сообщение Радислав Гандопас » 12 май 2015, 12:38

doter.ua писал(а):
Радислав Гандопас писал(а):Объясните пожалуйста кто-нибудь что-то не понимаю этого.

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

 SQLiteDatabase db = dbHelper.getWritableDatabase();
В этой строке получили объект класса SQLiteDatabase;

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

 Cursor c = db.query("mytable", null, null, null, null, null, null);
В этой получили объект класса Cursor.

Почему при создании этих объектов мы не использовали оператор new, как обычно это делали т.е. например вот так

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

Cursor c = new Cursor();
c =db.query("mytable", null, null, null, null, null, null); 
new вызывается для конструктора, если нью не стоит значит это обычный метод, который возвращает готовый объект (сам создает или берет готовый откуда-то еще).
Ясно. Спасибо

Аватара пользователя
wtor
Сообщения: 33
Зарегистрирован: 05 янв 2015, 16:27

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

Сообщение wtor » 12 май 2015, 13:32

Нужно ли android разработчику изучать MySQL?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 12 май 2015, 14:05

wtor писал(а):Нужно ли android разработчику изучать MySQL?
Скорее просто теорию по БД, элементарным запросам на выборку и т.д.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Metallurg
Сообщения: 3
Зарегистрирован: 24 май 2015, 13:32

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

Сообщение Metallurg » 24 май 2015, 13:38

приложение вылетает на телефоне при нажатии любой клавиши. Перепробовал кучу методов, но вернулся к коду, как в уроке(скопировал). Надеялся, что уж тут то заработает, но нет. Я так понимаю, что при каких-то обстоятельствах не создается БД.
Лог:
05-24 15:20:55.152 2235-29911/? E/RemoteViews﹕ ANR Warning,RemoteViews can only be used once ,if not ,it may cause ANR in hosts such as Laucher,SystemUI. keys for search <ANR Exception MSG History>
05-24 15:20:55.183 2235-29911/? E/RemoteViews﹕ ANR Warning,RemoteViews can only be used once ,if not ,it may cause ANR in hosts such as Laucher,SystemUI. keys for search <ANR Exception MSG History>
05-24 15:20:56.530 29884-29884/commeta83.vk.simplesqlite E/SQLiteLog﹕ (1) near "autoincrement": syntax error
05-24 15:20:56.537 29884-29884/commeta83.vk.simplesqlite E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: commeta83.vk.simplesqlite, PID: 29884
android.database.sqlite.SQLiteException: near "autoincrement": syntax error (code 1): , while compiling: create table myteble (idinteger primarykey autoincrement,name text,email text);
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:504)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1697)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1628)
at commeta83.vk.simplesqlite.MainActivity$DBHelper.onCreate(MainActivity.java:144)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at commeta83.vk.simplesqlite.MainActivity.onClick(MainActivity.java:83)
at android.view.View.performClick(View.java:4463)
at android.view.View$PerformClick.run(View.java:18789)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at dalvik.system.NativeStart.main(Native Method)

Что я делаю не так? уже голова дымится.

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

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

Сообщение Foenix » 24 май 2015, 14:49

неужели ты не видишь ошибку в запросе?
create table myteble (idinteger primarykey autoincrement,name text,email text);
R.id.team

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

Metallurg
Сообщения: 3
Зарегистрирован: 24 май 2015, 13:32

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

Сообщение Metallurg » 24 май 2015, 15:15

Foenix писал(а):неужели ты не видишь ошибку в запросе?
;
вижу то, что почему-то пишет не "mytable", а "myteble" и пробелы исчезают. Вопрос: почему? Ибо в коде написано по феншую.

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

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

Сообщение Foenix » 24 май 2015, 15:16

не может этого быть.
R.id.team

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

Metallurg
Сообщения: 3
Зарегистрирован: 24 май 2015, 13:32

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

Сообщение Metallurg » 24 май 2015, 15:25

Foenix писал(а):не может этого быть.
И я так думаю, но...
На данный момент код уже такой:

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

public static final String DB_NAME = "myBD";
        private static final String DB_VER = "1";
        public static final String TABLE_NAME = "mytable";
        public static final String TABLE_ID = "_id";
        public static final String NAME_TEXT = "name text";
        public static final String EMAIL_TEXT = "email text";

        private static final String DB_CREATE =
                "create table " + TABLE_NAME  +
                        "(" + TABLE_ID + " integer primary key, " +
                        NAME_TEXT + ", " + EMAIL_TEXT + ");";




        public DBHelper(Context context) {
            // конструктор суперкласса
            super(context, DB_NAME, null, Integer.parseInt(DB_VER));
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.d(LOG_TAG, "--- onCreate database ---");
            // создаем таблицу с полями
            db.execSQL(DB_CREATE);
        }
Запускаю, предварительно удалив прошлую версию с телефона...
Получаю лог:

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

05-24 17:23:14.296    7414-7414/commeta83.vk.simplesqlite E/SQLiteLog﹕ (10) Failed to do file read, got: 0, amt: 100, last Errno: 2
05-24 17:23:14.340    7414-7414/commeta83.vk.simplesqlite E/SQLiteLog﹕ (1) near "autoincrement": syntax error
05-24 17:23:14.347    7414-7414/commeta83.vk.simplesqlite E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: commeta83.vk.simplesqlite, PID: 7414
    android.database.sqlite.SQLiteException: near "autoincrement": syntax error (code 1): , while compiling: create table myteble (idinteger primarykey autoincrement,name text,email text);
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:893)
Хм.. Откуда в логе autoincrement, если я его убрал из кода?


P.S. закрыл проект. создал заново. Все заработало. В чем был глюк - так и не понял...

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

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

Сообщение Foenix » 24 май 2015, 15:44

это вообще не то код, не то место.
по ссылке в подписи. Слов нет.
R.id.team

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

KolyaMaster
Сообщения: 1
Зарегистрирован: 27 май 2015, 13:08

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

Сообщение KolyaMaster » 27 май 2015, 13:13

У меня выбивает ошибка в main
Вложения
Снимок.PNG
Снимок.PNG (99.16 КБ) 16688 просмотров

vanbios
Сообщения: 7
Зарегистрирован: 24 янв 2015, 20:27

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

Сообщение vanbios » 31 май 2015, 12:36

ребята, столкнулся с интересной проблемой:
в один из столбцов таблицы записываю double
...
"amount REAL NOT NULL,"
...
при записи до 8 знаков перед запятой включительно все работает
например, 12345678 или 12345678,54 потом корректно читаются с базы
если ввести 9 и больше знаков до запятой - выводятся абсолютно некорректные числа - с другими цифрами, а иногда даже отрицательные
похоже на то, что не хватает разрядности для таких больших чисел
но в официальной документации SQLite сказано, что REAL объединяет в себе все типы с плавающей точкой

может, кто-то сталкивался с такой проблемой, и подскажет, как профиксить?
пробовал заменять REAL на DOUBLE - результат тот же.
спасибо!

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 31 май 2015, 12:38

vanbios писал(а):ребята, столкнулся с интересной проблемой:
в один из столбцов таблицы записываю double
...
"amount REAL NOT NULL,"
...
при записи до 8 знаков перед запятой включительно все работает
например, 12345678 или 12345678,54 потом корректно читаются с базы
если ввести 9 и больше знаков до запятой - выводятся абсолютно некорректные числа - с другими цифрами, а иногда даже отрицательные
похоже на то, что не хватает разрядности для таких больших чисел
но в официальной документации SQLite сказано, что REAL объединяет в себе все типы с плавающей точкой

может, кто-то сталкивался с такой проблемой, и подскажет, как профиксить?
пробовал заменять REAL на DOUBLE - результат тот же.
спасибо!
NULL. The value is a NULL value.

INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.

REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.

TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).

BLOB. The value is a blob of data, stored exactly as it was input.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

vanbios
Сообщения: 7
Зарегистрирован: 24 янв 2015, 20:27

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

Сообщение vanbios » 31 май 2015, 12:40

KolyaMaster писал(а):У меня выбивает ошибка в main
скорее всего, твой layout файл имеет другое название, не main, или же не создан

vanbios
Сообщения: 7
Зарегистрирован: 24 янв 2015, 20:27

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

Сообщение vanbios » 31 май 2015, 12:47

doter.ua писал(а): NULL. The value is a NULL value.
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
BLOB. The value is a blob of data, stored exactly as it was input.
ну так 8 байт должно хватать

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 31 май 2015, 16:50

vanbios писал(а):
doter.ua писал(а): NULL. The value is a NULL value.
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
BLOB. The value is a blob of data, stored exactly as it was input.
ну так 8 байт должно хватать
не факт, записывай в TEXT и считывай Double.parseDouble("3.14");
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

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

Сообщение Foenix » 31 май 2015, 17:13

vanbios писал(а):ребята, столкнулся с интересной проблемой:
в один из столбцов таблицы записываю double
...
"amount REAL NOT NULL,"
...
при записи до 8 знаков перед запятой включительно все работает
например, 12345678 или 12345678,54 потом корректно читаются с базы
если ввести 9 и больше знаков до запятой - выводятся абсолютно некорректные числа - с другими цифрами, а иногда даже отрицательные
похоже на то, что не хватает разрядности для таких больших чисел
но в официальной документации SQLite сказано, что REAL объединяет в себе все типы с плавающей точкой

может, кто-то сталкивался с такой проблемой, и подскажет, как профиксить?
пробовал заменять REAL на DOUBLE - результат тот же.
спасибо!
вообще там по-моему всего 16 мест для цифр максимум (я имею ввиду как в калькуляторе разрядов)
поэтому все зависит от того как именно ты туда записываешь и выбираешь значения.
В java для операций с числами с десятичными знаками после запятой используются объекты BIGDECIMAL - для математики, финансов и т.д.
R.id.team

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

Ответить