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

Обсуждение уроков
Кошки Рулят
Сообщения: 9
Зарегистрирован: 15 мар 2016, 03:10

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

Сообщение Кошки Рулят » 21 мар 2016, 03:13

Foenix писал(а):сохраняй дату либо в формате 20160131
либо в виде лонга кол-во секунд с 71 года, кажется нужно Calendar использовать, не помню точно.
Мне удобнее первый формат, сразу видно какая дата, сортировать удобно и т.д. многие субд понимают этот фортмат как универсальный. А второй - когда дата содержит время, например, тайстемпы и т.д.
В таком формате разумеется сохраняет, потому что это не дата, а число.
А как ее потом показать юзеру в ListView при помощи SimpleCursorAdapter в нормальном человеческом виде? Пусть не прописью. Пусть в формате дд.мм.гггг

NapalmRain
Сообщения: 34
Зарегистрирован: 04 июн 2014, 10:21

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

Сообщение NapalmRain » 21 мар 2016, 08:33

Всем доброго времени суток!
Товарищи, пожалуйста подскажите где я не прав, уже начинаю чувствовать себя идиотом...
Создаю базу данных, заполняю её, затем получаю список того, что запомнил и приложение вылетает с ошибкой:

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

android.database.sqlite.SQLiteException: no such table: Sections (code 1): , while compiling: SELECT COUNT(*) AS Counter FROM `Sections`
Создаётся и заполняется база данных так:

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

public class DataBaseCore extends SQLiteOpenHelper {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "TestDB";

    public SQLiteDatabase DataBase;

    public DataBaseCore(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        try {
            DataBase = this.getWritableDatabase();
        } catch (SQLiteException ex){
            DataBase = this.getReadableDatabase();
        }
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_DB = "CREATE TABLE `Desired` (`id` INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , `goodid` INTEGER NOT NULL );" +
                "CREATE TABLE `Goods` (`id` INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , `VKGoodID` INTEGER NOT NULL , `CategoryID` INTEGER NOT NULL , `Title` VARCHAR(56) NOT NULL , `Description` TEXT, `Date` TimeStamp NOT NULL , `OwnerID` INTEGER NOT NULL , `Price` FLOAT NOT NULL  DEFAULT 0, `Currency` VARCHAR(5) NOT NULL , `Thumb` TEXT);" +
                "CREATE TABLE `Sections` (`id` INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , `SectionVKID` INTEGER NOT NULL , `Name` VARCHAR(24) NOT NULL );" +
                "CREATE TABLE `categories` (`id` INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , `VKCatID` INTEGER NOT NULL , `SectionID` INTEGER NOT NULL , `Name` VARCHAR(24) NOT NULL );" +
                "CREATE TABLE `sellers` (`id` INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL  UNIQUE , `Name` VARCHAR(56) NOT NULL , `SellerVKID` INTEGER NOT NULL );";
        db.execSQL(CREATE_DB);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS `Desired`;" +
                "DROP TABLE IF EXISTS `Goods`;" +
                "DROP TABLE IF EXISTS `Sections`;" +
                "DROP TABLE IF EXISTS `categories`;" +
                "DROP TABLE IF EXISTS `sellers`");
        onCreate(db);
    }

    public void categoriesUpdate() {
        //onUpgrade(DataBase, 1, 2);
        VKRequest request = new VKRequest("market.getCategories", VKParameters.from("count", 200));
        request.executeWithListener(new VKRequest.VKRequestListener() {
            @Override
            public void onComplete(VKResponse response) {
                try{
                    //парсим список категорий
                    JSONObject jsonObject = new JSONObject(response.responseString);
                    JSONObject resp = jsonObject.getJSONObject("response");
                    Category[] CatList = new Category[resp.getInt("count")];
                    ArrayList<Category> Section = new ArrayList<Category>();
                    JSONArray parray = resp.getJSONArray("items");
                    int LastSectionID = -1;

                    //Очищаем список категорий и подкатегорий
                    DataBase.execSQL("DELETE FROM `categories`"); // вообще крашится уже на этой строке с аналогичной ошибкой, но если эти две строки закомментировать, на инсерты не ругается вообще
                    DataBase.execSQL("DELETE FROM `Sections`");

                    Cursor cur = DataBase.rawQuery("select * from sqlite_master where type = 'table'", null);
                    cur.moveToFirst();
                    while (cur.isAfterLast()){
                        Log.w("TABLE NAME", cur.getString(0));
                        cur.moveToNext();
                    }
                    cur.close();
                    for (int i = 0; i < parray.length(); i++) { //Заносим новые данные в таблицы
                        JSONObject tmp = parray.getJSONObject(i);
                        JSONObject tmp2 = tmp.getJSONObject("Section");

                        ContentValues newCatLine = new ContentValues();
                        newCatLine.put("VKCatID", tmp.getInt("id"));
                        newCatLine.put("SectionID", tmp2.getInt("id"));
                        newCatLine.put("Name", tmp.getString("name"));
                        DataBase.insert("categories", null, newCatLine);

                        if (LastSectionID!=tmp2.getInt("id")) {
                            ContentValues newValues = new ContentValues();
                            newValues.put("SectionVKID", tmp2.getInt("id"));
                            newValues.put("Name", tmp2.getString("name"));
                            DataBase.insert("Sections", null, newValues);
                            LastSectionID = tmp2.getInt("id");
                        }
                    }


                    //draw (ProductList);
                } catch (JSONException e){
                    Log.e("ERROR_VK_JSON", e.toString());
                }
            }
            @Override
            public void onError(VKError error) {
                Log.e("ERROR_VK", error.toString());
            }
            @Override
            public void attemptFailed(VKRequest request, int attemptNumber, int totalAttempts) {
                Log.e("ERROR_VK", "Request is Failed");
            }
        });
    }
}
Я очень надеюсь на любую подсказку!

Заранее всем большое спасибо!

mishaberces
Сообщения: 3
Зарегистрирован: 19 мар 2016, 22:51

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

Сообщение mishaberces » 21 мар 2016, 13:17

Foenix писал(а):at com.example.misha.fizmap10.main.onCreate(main.java:201)
а тут что?

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

package com.example.misha.fizmap10;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

import com.example.misha.fizmap10.parser.JSONParser;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class main extends AppCompatActivity {

    // Создаем JSON парсер
    JSONParser jParser = new JSONParser();

    private ProgressDialog pDialog;

    // тут будет хранится список продуктов
    JSONArray para_array = null;
    // url отримання всіх пар
    public String url_all_products = "http://fizmat.kpnu.edu.ua/rozklad/get_all_products.php";

    // JSON Node names
    public final String TAG_SUCCESS = "success";
    public final String TAG_GRUPP = "grupp";
    public final String TAG_ID = "id";
    public final String TAG_PREDMET = "predmet";
    public final String TAG_VYKLADACH = "vykladach";
    public final String TAG_TYPPARY = "typpary";
    public final String TAG_DENJ = "denj";
    public final String TAG_NOMERPARY = "nomerpary";
    public final String TAG_AUDYTORIJA = "auditorija";
    public final String TAG_PRODUCTS="products";
    public final String TAG_CHYSELN="chyseln";
    public final String TAG_PREDMET_K="predmet_k";




    public String test = "";
    TextView textView_privet, text_Viev_chyselnyk;
    final int KEY_EKRAN = 1;
    public final String TABLE_BAZE = "table_fizmat";
    final int DIALOG = 1;

    DBHelper baze;
    TextView[][] text_rozklad = new TextView[7][8];
    PARA[][] para = new PARA[7][8];
    PARA[][] para_n = new PARA[7][8];
    SharedPreferences Spref;
    String priwet, umova = "vykladach=?", parametr_s, name_login, grup_login, text_null;


    int CHYSELN, CHYSELN_N;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        //перевіряємо авторизацію і авторизовуємося
        Spref = getSharedPreferences("login", MODE_PRIVATE);
        name_login = Spref.getString("nameLogin", "");
        grup_login = Spref.getString("grupLogin", "");
        String start_s=Spref.getString("Start", "");

        if(start_s=="") {
            Intent intent_about = new Intent(main.this, about.class);
            startActivity(intent_about);
        }

        textView_privet = (TextView) findViewById(R.id.textView_privet);
        text_Viev_chyselnyk=(TextView)findViewById(R.id.textView_chyselnyk);

        if (name_login != "") {
            priwet = "Розклад для викладача: " + name_login;
            //задаємо умову пошуку в базі
            umova = "vykladach=?";
            //список параметрів співпадінь

            parametr_s = name_login;
        }

        if (grup_login != "") {
            priwet = "Розклад для групи: " + grup_login;
            //задаємо умову пошуку в базі
            umova = "grupp=?";
            //список параметрів співпадінь
            parametr_s = grup_login;
        }


        if (name_login == "" && grup_login == "") {
            Intent intent = new Intent(main.this, login.class);
            startActivity(intent);
        }



        //захоплюємо текстові поля для розкладу
        text_rozklad[1][1] = (TextView) findViewById(R.id.textView11);
        text_rozklad[1][2] = (TextView) findViewById(R.id.textView12);
        text_rozklad[1][3] = (TextView) findViewById(R.id.textView13);
        text_rozklad[1][4] = (TextView) findViewById(R.id.textView14);
        text_rozklad[1][5] = (TextView) findViewById(R.id.textView15);
        text_rozklad[2][1] = (TextView) findViewById(R.id.textView21);
        text_rozklad[2][2] = (TextView) findViewById(R.id.textView22);
        text_rozklad[2][3] = (TextView) findViewById(R.id.textView23);
        text_rozklad[2][4] = (TextView) findViewById(R.id.textView24);
        text_rozklad[2][5] = (TextView) findViewById(R.id.textView25);
        text_rozklad[3][1] = (TextView) findViewById(R.id.textView31);
        text_rozklad[3][2] = (TextView) findViewById(R.id.textView32);
        text_rozklad[3][3] = (TextView) findViewById(R.id.textView33);
        text_rozklad[3][4] = (TextView) findViewById(R.id.textView34);
        text_rozklad[3][5] = (TextView) findViewById(R.id.textView35);
        text_rozklad[4][1] = (TextView) findViewById(R.id.textView41);
        text_rozklad[4][2] = (TextView) findViewById(R.id.textView42);
        text_rozklad[4][3] = (TextView) findViewById(R.id.textView43);
        text_rozklad[4][4] = (TextView) findViewById(R.id.textView44);
        text_rozklad[4][5] = (TextView) findViewById(R.id.textView45);
        text_rozklad[5][1] = (TextView) findViewById(R.id.textView51);
        text_rozklad[5][2] = (TextView) findViewById(R.id.textView52);
        text_rozklad[5][3] = (TextView) findViewById(R.id.textView53);
        text_rozklad[5][4] = (TextView) findViewById(R.id.textView54);
        text_rozklad[5][5] = (TextView) findViewById(R.id.textView55);
        text_rozklad[6][1] = (TextView) findViewById(R.id.textView61);
        text_rozklad[6][2] = (TextView) findViewById(R.id.textView62);
        text_rozklad[6][3] = (TextView) findViewById(R.id.textView63);
        text_rozklad[6][4] = (TextView) findViewById(R.id.textView64);
        text_rozklad[6][5] = (TextView) findViewById(R.id.textView65);

        baze = new DBHelper(this);
        //  скачуємо з бази
        SQLiteDatabase db = baze.getWritableDatabase();



        //зчитування початку семестру
        Cursor cursor_d = db.query(TABLE_BAZE, null, "grupp=?", new String[]{"datasetup"}, null, null, null);
        // определяем номера столбцов по имени в выборке
        int id_rik_start = cursor_d.getColumnIndex("typpary");
        int id_misjac_start = cursor_d.getColumnIndex("denj");
        int id_chislo_start = cursor_d.getColumnIndex("nomerpary");
        int id_chys = cursor_d.getColumnIndex("chyseln");

        int rik_start=2013;
        int misjac_start=0;
        int chislo_start=0;

        while (cursor_d.moveToNext()) {
             rik_start = Integer.parseInt(cursor_d.getString(id_rik_start));
             misjac_start = Integer.parseInt(cursor_d.getString(id_misjac_start));
             chislo_start = Integer.parseInt(cursor_d.getString(id_chislo_start));

        }




        Calendar thatDay = Calendar.getInstance();
        thatDay.set(Calendar.DAY_OF_MONTH, chislo_start);
        thatDay.set(Calendar.MONTH, misjac_start); // 0-11 на 1 меньше нумерація місяців з 0
        thatDay.set(Calendar.YEAR, rik_start);

        Calendar today = Calendar.getInstance();

        long diff = today.getTimeInMillis() - thatDay.getTimeInMillis(); //result in millis

        long rizn = diff / (1000 * 3600 * 24*7)+1;

        if ((int)rizn%2==1){CHYSELN=2; CHYSELN_N=3; text_Viev_chyselnyk.setText("Діє чисельник"); text_null="Знаменник";} else {CHYSELN=3;  CHYSELN_N=2; text_Viev_chyselnyk.setText("Діє знаменник");text_null="Чисельник";}




        Cursor cursor = db.query(TABLE_BAZE, null, umova, new String[]{parametr_s}, null, null, null);

        // определяем номера столбцов по имени в выборке
        int id_predmet = cursor.getColumnIndex(TAG_PREDMET);
        int id_grupp = cursor.getColumnIndex(TAG_GRUPP);
        int id_vykladach = cursor.getColumnIndex(TAG_VYKLADACH);
        int id_typpary = cursor.getColumnIndex(TAG_TYPPARY);
        int id_denj = cursor.getColumnIndex(TAG_DENJ);
        int id_nomerpary = cursor.getColumnIndex(TAG_NOMERPARY);
        int id_auditorija = cursor.getColumnIndex(TAG_AUDYTORIJA);
        int id_chyseln = cursor.getColumnIndex(TAG_CHYSELN);
        int id_predmet_k = cursor.getColumnIndex(TAG_PREDMET_K);





        while (cursor.moveToNext()) {

            //отримуємо необхідні дані для пари
            int chyseln = Integer.parseInt(cursor.getString(id_chyseln));

            if (chyseln == CHYSELN || chyseln == 1){
                String predmet = cursor.getString(id_predmet);
                String grupp = cursor.getString(id_grupp);
                String vykladach = cursor.getString(id_vykladach);
                int typpary = Integer.parseInt(cursor.getString(id_typpary));
                int denj = Integer.parseInt(cursor.getString(id_denj));
                int nomerpary = Integer.parseInt(cursor.getString(id_nomerpary));
                String auditorija = cursor.getString(id_auditorija);
                String predmet_k = cursor.getString(id_predmet_k);

                //створюємо обєкт пара, або добавляємо викладача
                if (para[nomerpary][denj]==null){ para[nomerpary][denj] = new PARA(predmet, grupp, vykladach, typpary, denj, nomerpary, auditorija, chyseln, predmet_k);}
                else {para[nomerpary][denj].add_vykladach(vykladach, auditorija);}

                // заповнюємо відповідне текстове поле
                TextView text_tmp = text_rozklad[nomerpary][denj];
                String sT = predmet_k + "\n" + auditorija;
                text_tmp.setText(sT);
                switch (typpary) {
                    case 1:
                        text_tmp.setBackgroundColor(getResources().getColor(R.color.lekcii_color));
                        break;
                    case 2:
                        text_tmp.setBackgroundColor(getResources().getColor(R.color.praktychna_color));
                        break;
                    case 3:
                        text_tmp.setBackgroundColor(getResources().getColor(R.color.laboratorni_color));
                        break;
                }
            }



            if (chyseln == CHYSELN_N || chyseln == 1){
                String predmet = cursor.getString(id_predmet);
                String grupp = cursor.getString(id_grupp);
                String vykladach = cursor.getString(id_vykladach);
                int typpary = Integer.parseInt(cursor.getString(id_typpary));
                int denj = Integer.parseInt(cursor.getString(id_denj));
                int nomerpary = Integer.parseInt(cursor.getString(id_nomerpary));
                String auditorija = cursor.getString(id_auditorija);
                String predmet_k = cursor.getString(id_predmet_k);

                //створюємо обєкт пара, або добавляємо викладача
                if (para_n[nomerpary][denj]==null){ para_n[nomerpary][denj] = new PARA(predmet, grupp, vykladach, typpary, denj, nomerpary, auditorija, chyseln, predmet_k);}
                else {para_n[nomerpary][denj].add_vykladach(vykladach, auditorija);}

                if (text_rozklad[nomerpary][denj].getText().toString()=="") {
                    text_rozklad[nomerpary][denj].setBackgroundColor(getResources().getColor(R.color.pusto_color));
                    text_rozklad[nomerpary][denj].setText(text_null);

                }

            }


        }


        textView_privet.setText(priwet);
    }

На HTC удалось запустить по таком алгоритме: закоментировал работу с базой -- запустилось.
Розкоментировал и о-чудо заработало. До того постоянно одну и туж ошибку в лог писало. Но понятно что такая последовательность не вариант.

если конкретно про 201 строчку то тут
Cursor cursor = db.query(TABLE_BAZE, null, umova, new String[]{parametr_s}, null, null, null);
Последний раз редактировалось mishaberces 23 мар 2016, 08:54, всего редактировалось 3 раза.

NapalmRain
Сообщения: 34
Зарегистрирован: 04 июн 2014, 10:21

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

Сообщение NapalmRain » 21 мар 2016, 22:31

В общем сам нашёл ответ...
Если кому интересно: Эта хренотень не поддерживает выполнение сразу нескольких запросов в одной команде. Разбил отдельно создание каждой таблицы и всё стало хорошо.

mishaberces
Сообщения: 3
Зарегистрирован: 19 мар 2016, 22:51

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

Сообщение mishaberces » 23 мар 2016, 09:52

Foenix писал(а):at com.example.misha.fizmap10.main.onCreate(main.java:201)
а тут что?
Спасибо за подсказку. Разобрался.

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

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

Сообщение Foenix » 23 мар 2016, 11:53

Кошки Рулят писал(а):
Foenix писал(а):сохраняй дату либо в формате 20160131
либо в виде лонга кол-во секунд с 71 года, кажется нужно Calendar использовать, не помню точно.
Мне удобнее первый формат, сразу видно какая дата, сортировать удобно и т.д. многие субд понимают этот фортмат как универсальный. А второй - когда дата содержит время, например, тайстемпы и т.д.
В таком формате разумеется сохраняет, потому что это не дата, а число.
А как ее потом показать юзеру в ListView при помощи SimpleCursorAdapter в нормальном человеческом виде? Пусть не прописью. Пусть в формате дд.мм.гггг
при помощи класса Calendar
либо SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.getDefault());
в адаптере списка, например, переопределяя метод getView()
R.id.team

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

Кошки Рулят
Сообщения: 9
Зарегистрирован: 15 мар 2016, 03:10

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

Сообщение Кошки Рулят » 26 мар 2016, 02:03

Foenix писал(а):
Кошки Рулят писал(а):
Foenix писал(а):сохраняй дату либо в формате 20160131
либо в виде лонга кол-во секунд с 71 года, кажется нужно Calendar использовать, не помню точно.
Мне удобнее первый формат, сразу видно какая дата, сортировать удобно и т.д. многие субд понимают этот фортмат как универсальный. А второй - когда дата содержит время, например, тайстемпы и т.д.
В таком формате разумеется сохраняет, потому что это не дата, а число.
А как ее потом показать юзеру в ListView при помощи SimpleCursorAdapter в нормальном человеческом виде? Пусть не прописью. Пусть в формате дд.мм.гггг
при помощи класса Calendar
либо SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm", Locale.getDefault());
в адаптере списка, например, переопределяя метод getView()
Все проще
Текстовое поле надо получать из базы не как в уроках
cursor.getInt(DataDocIndex),
а
cursor.getString(DataDocIndex)
этот метод вернет строку как она записана в таблице и не станет приводить ее к числу ...

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

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

Сообщение Foenix » 28 мар 2016, 20:15

тебе надо в формат переводить, я и ответила на этот вопрос. А то что это число или строка в данном случае почти не важно.
R.id.team

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

qwerty
Сообщения: 2
Зарегистрирован: 12 май 2016, 12:14

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

Сообщение qwerty » 12 май 2016, 12:25

Подскажите пожалуйста. Если я не собираюсь расшаривать данные своего приложения, то стоит использовать БД напрямую или все же использовать ContentProvider + SQLite? Если буду использовать БД без провайдера, то потеряю какие-нибудь плюсы от связки ContentProvider + SQLite?

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

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

Сообщение Foenix » 12 май 2016, 12:44

да, надо делать. Ничего страшного там нет. Даже генераторы КП уже придумали.
Например, когда ты захочешь сделать списки с лоадерами - то не сможешь воспользоваться их полной мощью так сказать, посколько с помощью К.П, происходит автоматическое уведомление об изменениях в бд где бы то ни было.
R.id.team

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

qwerty
Сообщения: 2
Зарегистрирован: 12 май 2016, 12:14

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

Сообщение qwerty » 13 май 2016, 12:27

Ясно, то есть от провайдеров только плюсы. Спасибо за помощь!

omonwik
Сообщения: 1
Зарегистрирован: 21 май 2016, 20:45

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

Сообщение omonwik » 21 май 2016, 21:06

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

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    EditText editName, editMail;
    Button btnAdd, btnRead, btnClear;
    DBHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editMail = (EditText)findViewById(R.id.editMail);
        editName = (EditText)findViewById(R.id.editName);

        btnAdd = (Button)findViewById(R.id.btnAdd);
        btnRead = (Button)findViewById(R.id.btnRead);
        btnClear = (Button)findViewById(R.id.btnClear);

        btnAdd.setOnClickListener(this);
        btnRead.setOnClickListener(this);
        btnClear.setOnClickListener(this);

        dbHelper = new DBHelper(this);
    }

    @Override
    public void onClick(View v) {
        ContentValues contentValues = new ContentValues();
        String name = editName.getText().toString();
        String mail = editMail.getText().toString();
        SQLiteDatabase database = dbHelper.getWritableDatabase();

        switch (v.getId()){
            case R.id.btnAdd:
                contentValues.put("name", name);
                contentValues.put("mail", mail);
                database.insert("Contacts", null, contentValues);
                Log.d("myLogg", "Строка вставлена");
                break;
            case R.id.btnRead:
                Cursor cursor = database.query("Contacts", null,null,null,null,null,null);
                if(cursor.moveToFirst()){
                    int idIndex = cursor.getColumnIndex("id");
                    int nameIndex = cursor.getColumnIndex("name");
                    int mailIndex = cursor.getColumnIndex("mail");

                    do{
                        Log.d("myLogg", "ID = " + cursor.getInt(idIndex) +
                        " Name = " + cursor.getString(nameIndex) + " Email = " + cursor.getString(mailIndex));
                    } while (cursor.moveToNext());
                } else Log.d("myLogg", "0 rows inserted");
                cursor.close();
                break;
            case R.id.btnClear:
                database.delete("Contacts", null, null);
                Toast.makeText(MainActivity.this, "База удалена", Toast.LENGTH_SHORT).show();
                break;
        }
        dbHelper.close();
    }
}

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

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper{

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MyDatabase";
    public static final String TABLE_NAME = "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_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME + "(" + KEY_ID + " integer primary key autoincrement, " + KEY_NAME + " text, " + KEY_MAIL + " text" + ")");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists " + TABLE_NAME);
    }
}
Уже два дня бьюсь с этим уроком
Не создается столбец name, в чем проблема?

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

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

Сообщение Foenix » 21 май 2016, 22:02

Версию поменяй, если ты менял структуру, и в onUpgrade создавать таблицу надо, а не только дропать.
R.id.team

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

AABL
Сообщения: 5
Зарегистрирован: 10 мар 2016, 15:20

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

Сообщение AABL » 22 май 2016, 12:20

Как можно обновить курсорлоадер из диалога?
На событие Dismiss() диалога, добавляется запись в БД, но лоадер не обновляется
getLoaderManager().getLoader(0).forceLoad();

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

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

Сообщение Foenix » 22 май 2016, 13:38

Не нужно из диалога ни в коем случае это делать. В контент провайдере нужно посылать нотифай и все обновится само.
R.id.team

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

anapel
Сообщения: 2
Зарегистрирован: 30 сен 2015, 10:52

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

Сообщение anapel » 11 июл 2016, 13:48

anapel писал(а):Подскажите как можно просмотреть БД созданную моим приложением ? в /data/..... попасть не могу говорит нет доступа
Случайно обнаружил ответ на свой старый вопрос.
На не рутованном телефоне БД можно просмотреть на компе сделав бекап своего приложения при помощи adb.

выводим список установленных приложений и находим свое(my_packages)
adb.exe shell pm list packages

делаем бекап своего приложения
adb backup -f my_packages_backup_name my_packages

при помощи abe(android backup extractor) распаковываем бекап своего приложения
java -jar abe.jar unpack my_packages_backup_name my_packages_backup_name.tar

В результате получаем обычный архив my_packages_backup_name.tar внутри которого есть файл db, который открывается любым SQLlight вьюером.

neon
Сообщения: 1
Зарегистрирован: 10 авг 2016, 15:06

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

Сообщение neon » 10 авг 2016, 15:31

Здравствуйте, подскажите пожалуйста Как лучше организовать структуру БД, для работы с большими массивами данных, одного типа, например разных независимых картотек, чтоб пользователю можно было переключаться между ними, создавать новые и удалять ненужные (картотеки):
так вот, лучше организовать их - базами и создавать несколько разных баз, работать в определенный момент с нужной, которые станут ненужны - удалить.
Или использовать в одной базе много таблиц и их добавлять/удалять.
Или это одинаково по скорости работы / надежности.
Спасибо!

Аватара пользователя
Foxy
Сообщения: 13
Зарегистрирован: 15 дек 2016, 14:57
Откуда: Volgograd
Контактная информация:

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

Сообщение Foxy » 19 дек 2016, 20:10

Ребят, такой вопрос.
Я почти никогда не занимался программированием, в универе немного C# учил, потом немного увлекался разработкой небольших игрушек на Unity, для скриптинга использовал тот же C#, то есть Java для меня не в новинку, скажем так :)

Все предыдущие уроки были по сути элементарны, теперь я их с легкостью повторю без каких-либо подсказок, с закрытыми глазами. :)
А вот этот урок.. Да, я в принципе понял всё, что я писал, ибо всё закомменчено + описаны сами уроки очень здорово и подробно. Но скажу честно - я это точно не повторю самостоятельно. Никогда не работал с SQL, впервые сталкиваюсь. Скажите, что еще почитать можно, чтобы получше разобраться? Чтобы можно было самому это писать, а не просто понимать написанное? Достаточно разве просто последующих уроков? Думаю, нет.
Спасибо )

BirviZ
Сообщения: 1
Зарегистрирован: 24 апр 2017, 11:26

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

Сообщение BirviZ » 24 апр 2017, 11:30

А что будет с базой после удаления приложения. Как я понимаю, она останется и при удалении приложения ее нужно как то удалять.

Droidoc
Сообщения: 7
Зарегистрирован: 23 дек 2016, 07:52

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

Сообщение Droidoc » 23 май 2017, 20:49

BirviZ писал(а):А что будет с базой после удаления приложения. Как я понимаю, она останется и при удалении приложения ее нужно как то удалять.
При удалении приложения sqlite-база данных удаляется вместе с ним , также можно вручную удалить данные приложения в настройках устройства

Ответить