Всем привет, подскажите, как сделать загрузку данных из БД для нескольких фрагментов, уже весь мозг сломал))
По урокам, я разобрался, как сделать для одно фрагмента. Создал класс BD для работы с базой, все ок. Если делаю второй фрагмент, нужно ли создавать новый класс, например BD2? Я пробовал так делать, чтобы создать вторую таблицу, но все время вылетает ошибка что вторую таблицу он не видит, т.е. не создает почему-то. Как это правильно делается? Единственное, чего я добился, это если создавать другую БД, то тогда все работает, но как сделать так, чтобы работало через одну, с разными таблицами?
В какую сторону копать, много перечитал на форуме, но ответа так и не нашел. Заранее спасибо.
Cursor Loader и несколько fragmnets
Re: Cursor Loader и несколько fragmnets
Прошу прощения за дурацкий вопрос без логов и т.д.) Во всем разобрался, вот код, может пригодиться кому в качестве примера, ибо я таких не нашел.
DB.java
first.java
second.java
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) {
}
}
Код: Выделить всё
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;
}
}
Код: Выделить всё
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;
}
}