Помогите с таблицами в базе SQLite

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Nikro
Сообщения: 2
Зарегистрирован: 15 дек 2015, 17:16

Помогите с таблицами в базе SQLite

Сообщение Nikro » 15 апр 2016, 20:47

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

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

import com.example.nikromantik.starbuzz.DessertFiles.DessertCategoryActivity;
import com.example.nikromantik.starbuzz.DrinkFiles.DrinkActivity;
import com.example.nikromantik.starbuzz.DrinkFiles.DrinkCategoryActivity;
import com.example.nikromantik.starbuzz.FoodFiles.FoodCategoryActivity;

public class TopLevelActivity extends AppCompatActivity {

    private SQLiteDatabase db;
    private Cursor favoriteCursor;

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

        ListView listView = (ListView) findViewById(R.id.listOptions);

        //слушатель для спискового представления
        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> listView, View itemView, int position, long id) {
                if (position == 0) {
                    Intent intent = new Intent(TopLevelActivity.this, DrinkCategoryActivity.class);
                    startActivity(intent);
                }else if (position == 1) {
                    Intent intent = new Intent(TopLevelActivity.this, FoodCategoryActivity.class);
                    startActivity(intent);
                }else if (position == 2){
                    Intent intent = new Intent(TopLevelActivity.this, DessertCategoryActivity.class);
                    startActivity(intent);
                }
            }
        };

        //Добавить слушателя к списковому представлению
        listView.setOnItemClickListener(itemClickListener);


        //Получить списковое представление любимых напитков
        ListView listFavorite = (ListView) findViewById(R.id.list_favorites);

        try {
            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
            db = starbuzzDatabaseHelper.getReadableDatabase();

            //курсор, содержащий значения столбцов _id и NAME для записей, у которых FAVORITE = 1
            favoriteCursor = db.query("DRINK",
                    new String[] {"_id", "NAME"}, "FAVORITE = 1", null, null, null, null);

            CursorAdapter favoriteAdapter = new SimpleCursorAdapter(TopLevelActivity.this,
                    android.R.layout.simple_list_item_1, favoriteCursor, new String[] {"NAME"},
                    new int[] {android.R.id.text1}, 0);

            listFavorite.setAdapter(favoriteAdapter);

        }catch (SQLiteException e) {
            Toast.makeText(this, "База данных не доступна", Toast.LENGTH_SHORT).show();
        }

        //Переход к DrinkActivity при выборе напитка
        listFavorite.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Intent intent = new Intent(TopLevelActivity.this, DrinkActivity.class);
                intent.putExtra(DrinkActivity.EXTRA_DRINKNO, (int)id);
                startActivity(intent);
            }
        });
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        favoriteCursor.close();
        db.close();
    }

    @Override
    public void onRestart(){
        super.onRestart();

        try {
            SQLiteOpenHelper starbuzzDatabaseHelper = new StarbuzzDatabaseHelper(this);
            db = starbuzzDatabaseHelper.getWritableDatabase();
            Cursor newCursor = db.query("DRINK",
                    new String[] {"_id", "NAME"}, "FAVORITE = 1", null, null, null, null);
            ListView listFavorites = (ListView) findViewById(R.id.list_favorites);
            //Получить адаптер спискового представления
            CursorAdapter adapter = (CursorAdapter) listFavorites.getAdapter();
            //Заменить курсор, используемый адаптером курсора, новым
            adapter.changeCursor(newCursor);
            favoriteCursor = newCursor;

        }catch (SQLiteException e) {
            Toast.makeText(this, "База данных не доступна", Toast.LENGTH_SHORT).show();
        }
    }
}
Здравствуйте. Изучаю android по книге Head First Android. Там создается приложение Старбаз где есть главное активити, за ним идет активити категорий и за ними уже активити детализации. Все заполнение идет через базу данный SQLite. В активити детализации есть флажок фаворит, для того что бы пользователь мог запомнить те напитки еду или десерт которые он выбирал уже. Они сохраняются и выводятся в ListView на главном активити, код которого я написал выше. В коде все данные берутся только из таблицы DRINK и если я выбираю например еду или десерт то они не отображаются на главном активити до тех пор пока я не поменяю DRINK на FOOD. Я хочу, что бы если я отметил как фаворит один напиток, еду и десерт, то они все выводились на главном активити в ListView. Я так понимаю, мне нужно что бы данные читались сразу из всех таблиц, и все записи помеченные как фаворит выводились на главном активити, но как это сделать.
Не кидайтесь кирпичами, я только учусь :)) Объяснил как смог, если кто понял прошу помощи.

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

Re: Помогите с таблицами в базе SQLite

Сообщение Foenix » 15 апр 2016, 22:07

Тебе нужен ну для первого приближения rawQuery, т.е. метод в который ты будешь писать любой запрос, а не только запрос к 1 таблице.
В этом запросе нужно объединить таблицы все три примерно таким образом
select ... from drink where favourite=1
union
select ... from food where favourite=1
union
select ... from desert where favourite=1
где вместо ... поставь одинаковые поля из всех таблиц.

Можно извратиться чисто визуально. Сделать на 1 активити не 1 листвью, а три, где в каждом будет запрос к 1 таблице.
R.id.team

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

Nikro
Сообщения: 2
Зарегистрирован: 15 дек 2015, 17:16

Re: Помогите с таблицами в базе SQLite

Сообщение Nikro » 16 апр 2016, 00:12

Спасибо. Через rawQuery попробую для начала ;)

Ответить