Cursor Loader и несколько fragmnets

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
dj.ymep
Сообщения: 5
Зарегистрирован: 19 июн 2016, 20:35

Cursor Loader и несколько fragmnets

Сообщение dj.ymep » 01 авг 2016, 02:41

Всем привет, подскажите, как сделать загрузку данных из БД для нескольких фрагментов, уже весь мозг сломал))

По урокам, я разобрался, как сделать для одно фрагмента. Создал класс BD для работы с базой, все ок. Если делаю второй фрагмент, нужно ли создавать новый класс, например BD2? Я пробовал так делать, чтобы создать вторую таблицу, но все время вылетает ошибка что вторую таблицу он не видит, т.е. не создает почему-то. Как это правильно делается? Единственное, чего я добился, это если создавать другую БД, то тогда все работает, но как сделать так, чтобы работало через одну, с разными таблицами?
В какую сторону копать, много перечитал на форуме, но ответа так и не нашел. Заранее спасибо.

dj.ymep
Сообщения: 5
Зарегистрирован: 19 июн 2016, 20:35

Re: Cursor Loader и несколько fragmnets

Сообщение dj.ymep » 02 авг 2016, 12:41

Прошу прощения за дурацкий вопрос без логов и т.д.) Во всем разобрался, вот код, может пригодиться кому в качестве примера, ибо я таких не нашел.
DB.java

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

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DB {

    final  String TAG = "DB";

    private static final String DB_NAME = "testdb";
    private static final int DB_VERSION = 1;

    //Таблица Contacts
    private static final String DB_TABLE_CONTACTS = "contacts";
    public static final String COLUMN_CONTACTS_ID = "_id";
    public static final String COLUMN_CONTACTS_LOGO = "img";
    public static final String COLUMN_CONTACTS_NAME = "txt";
    public static final String COLUMN_CONTSCTS_ABOUT = "txt";
    private static final String DB_CREATE_TABLE_CONTACTS =
            "create table " + DB_TABLE_CONTACTS + "(" +
                    COLUMN_CONTACTS_ID + " integer primary key autoincrement, " +
                    COLUMN_CONTACTS_LOGO + " integer, " +
                    COLUMN_CONTACTS_NAME+ " text" +
                    COLUMN_CONTSCTS_ABOUT+ "text" +
                    ");";

    //Таблица Groups
    private static final String DB_TABLE_GROUPS = "groups";
    public static final String COLUMN_GROUPS_ID = "_id";
    public static final String COLUMN_GROUPS_LOGO = "img";
    public static final String COLUMN_GROUPS_NAME = "txt";
    public static final String COLUMN_GROUPS_ABOUT = "txt";
    private static final String DB_CREATE_TABLE_GROUPS =
            "create table " + DB_TABLE_GROUPS + "(" +
                    COLUMN_GROUPS_ID + " integer primary key autoincrement, " +
                    COLUMN_GROUPS_LOGO + " integer, " +
                    COLUMN_GROUPS_NAME + " text" +
                    COLUMN_GROUPS_ABOUT+ "text" +
                    ");";

    private final Context mCtx;

    private DBHelper mDBHelper;
    private SQLiteDatabase mDB;

    public DB(Context ctx) {
        mCtx = ctx;
    }

    // открыть подключение
    public void open() {
        mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
        mDB = mDBHelper.getWritableDatabase();
    }

    // закрыть подключение
    public void close() {
        if (mDBHelper!=null) mDBHelper.close();
    }

    // получить все данные из таблицы CONTACTS
    public Cursor ContactsGetAllData() {
        return mDB.query(DB_TABLE_CONTACTS, null, null, null, null, null, null);
    }

    // получить все данные из таблицы GROUPS
    public Cursor GroupsGetAllData() {
        return mDB.query(DB_TABLE_GROUPS, null, null, null, null, null, null);
    }

    // добавить запись в CONTACTS
    public void ContactsAddRec(String txt, int img) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_CONTACTS_NAME, txt);
        cv.put(COLUMN_CONTSCTS_ABOUT, txt);
        cv.put(COLUMN_CONTACTS_LOGO, img);
        mDB.insert(DB_TABLE_CONTACTS, null, cv);
    }

    // добавить запись в GROUPS
    public void GroupsAddRec(String txt, int img) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_GROUPS_NAME, txt);
        cv.put(COLUMN_GROUPS_ABOUT, txt);
        cv.put(COLUMN_GROUPS_LOGO, img);
        mDB.insert(DB_TABLE_GROUPS, null, cv);
    }

    // удалить запись из CONTACTS
    public void ContactsDelRec(long id) {
        mDB.delete(DB_TABLE_CONTACTS, COLUMN_CONTACTS_ID + " = " + id, null);
    }

    // удалить запись из GROUPS
    public void GroupsDelRec(long id) {
        mDB.delete(DB_TABLE_GROUPS, COLUMN_GROUPS_ID + " = " + id, null);
    }

    // класс по созданию и управлению БД
    private class DBHelper extends SQLiteOpenHelper {

        public DBHelper(Context context, String name, CursorFactory factory,
                        int version) {
            super(context, name, factory, version);
        }

        // создаем и заполняем БД
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DB_CREATE_TABLE_CONTACTS);
            // Заполняем таблицу CONTACTS
            ContentValues cvc = new ContentValues();
            for (int i = 1; i < 25; i++) {
                cvc.put(COLUMN_CONTACTS_NAME, "sometext " + i);
                cvc.put(COLUMN_CONTSCTS_ABOUT, "about_info"+ i);
                cvc.put(COLUMN_CONTACTS_LOGO, R.mipmap.ic_launcher);
                db.insert(DB_TABLE_CONTACTS, null, cvc);
            }

            db.execSQL(DB_CREATE_TABLE_GROUPS);
            // Заполняем таблицу GROUPS
            ContentValues cvg = new ContentValues();
            for (int i = 1; i < 20; i++) {
                cvg.put(COLUMN_GROUPS_NAME, "sometext " + i);
                cvg.put(COLUMN_GROUPS_ABOUT, "about_info"+ i);
                cvg.put(COLUMN_GROUPS_LOGO, R.mipmap.ic_launcher);
                db.insert(DB_TABLE_GROUPS, null, cvg);
            }
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
first.java

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

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
/**
 * A simple {@link Fragment} subclass.
 */
public class First extends Fragment implements LoaderCallbacks<Cursor> {

    private static final int CM_DELETE_ID = 1;
    ListView lvData;
    DB db;
    SimpleCursorAdapter scAdapter;

    public static First newInstance() {
        First fragment = new First();
        return fragment;
    }

    public First() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View v = inflater.inflate(R.layout.fragment_first, container, false);


        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_CONTACTS_LOGO, DB.COLUMN_CONTACTS_NAME };
        int[] to = new int[] { R.id.ivImg, R.id.tvText };

        // создаем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
        lvData = (ListView) v.findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);

        return v;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // открываем подключение к БД
        db = new DB(getActivity());
        db.open();

        // создаем лоадер для чтения данных
        getActivity().getSupportLoaderManager().initLoader(0, null, this);
    }

    public void onDestroyView() {
        super.onDestroyView();
        // закрываем подключение при выходе
        db.close();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(getActivity(), db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    }

    static class MyCursorLoader extends CursorLoader {

        DB db;

        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.ContactsGetAllData();
            return cursor;
        }
    }
second.java

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

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
/**
 * A simple {@link Fragment} subclass.
 */
public class Second extends Fragment implements LoaderCallbacks<Cursor> {

    private static final int CM_DELETE_ID = 1;
    ListView lvData;
    DB db;
    SimpleCursorAdapter scAdapter;

    public static Second newInstance() {
        Second fragment = new Second();
        return fragment;
    }

    public Second() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_second, container, false);

        // формируем столбцы сопоставления
        String[] from = new String[] { DB.COLUMN_GROUPS_LOGO, DB.COLUMN_GROUPS_NAME };
        int[] to = new int[] { R.id.ivImg, R.id.tvText };

        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(getActivity(), R.layout.item, null, from, to, 0);
        lvData = (ListView) v.findViewById(R.id.lvData);
        lvData.setAdapter(scAdapter);

        return v;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // открываем подключение к БД
        db = new DB(getActivity());
        db.open();

        // создаем лоадер для чтения данных
        getActivity().getSupportLoaderManager().initLoader(1, null, this);
    }

    public void onDestroyView() {
        super.onDestroyView();
        // закрываем подключение при выходе
        db.close();
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(getActivity(), db);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    }

    static class MyCursorLoader extends CursorLoader {

        DB db;

        public MyCursorLoader(Context context, DB db) {
            super(context);
            this.db = db;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = db.GroupsGetAllData();
            return cursor;
        }
    }

Ответить