Страница 38 из 39

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

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

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

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

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

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");
            }
        });
    }
}
Я очень надеюсь на любую подсказку!

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

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

Добавлено: 21 мар 2016, 13:17
mishaberces
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);

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

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

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

Добавлено: 23 мар 2016, 09:52
mishaberces
Foenix писал(а):at com.example.misha.fizmap10.main.onCreate(main.java:201)
а тут что?
Спасибо за подсказку. Разобрался.

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

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

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)
этот метод вернет строку как она записана в таблице и не станет приводить ее к числу ...

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

Добавлено: 28 мар 2016, 20:15
Foenix
тебе надо в формат переводить, я и ответила на этот вопрос. А то что это число или строка в данном случае почти не важно.

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

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

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

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

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

Добавлено: 13 май 2016, 12:27
qwerty
Ясно, то есть от провайдеров только плюсы. Спасибо за помощь!

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

Добавлено: 21 май 2016, 21:06
omonwik

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

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, в чем проблема?

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

Добавлено: 21 май 2016, 22:02
Foenix
Версию поменяй, если ты менял структуру, и в onUpgrade создавать таблицу надо, а не только дропать.

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

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

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

Добавлено: 22 май 2016, 13:38
Foenix
Не нужно из диалога ни в коем случае это делать. В контент провайдере нужно посылать нотифай и все обновится само.

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

Добавлено: 11 июл 2016, 13:48
anapel
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 вьюером.

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

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

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

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

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

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

Добавлено: 24 апр 2017, 11:30
BirviZ
А что будет с базой после удаления приложения. Как я понимаю, она останется и при удалении приложения ее нужно как то удалять.

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

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