Для вывода списка из БД в RecyclerView у меня получились такие классы.
Делала адаптер по типу https://gist.github.com/skyfishjy/443b7448f59be978bc59
Я не поняла что писать в
public static BludaList fromCursor(Cursor cursor) {
//TODO return your MyListItem from cursor.
}
И как в MainActivity вывести потом список? Там не приведен пример класса MainActivity.
Вот сами классы
Contract.java
public final class Contract {
private Contract() {}
public static final String DB_NAME = "bluda.db";
public static final int DB_VERSION = 1;
public static abstract class Bluda implements BaseColumns {
public static final String TAB_BLUDA = "bluda";
public final static String _ID = BaseColumns._ID;
public static final String COL_BLUDO = "bludo";
public static final String COL_RECEPT = "recept";
public static final String COL_LIKE = "like";
}
}
DBHelper.java
public class DBHelper extends SQLiteOpenHelper {
private static String DB_PATH;
public SQLiteDatabase database;
private Context myContext;
public DBHelper(Context context) {
super(context, Contract.DB_NAME, null, Contract.DB_VERSION);
this.myContext = context;
try {
DB_PATH = myContext.getDatabasePath(Contract.DB_NAME).toString();
createDataBase();
openDataBase();
} catch (IOException e) {
e.printStackTrace();
}
}
public Cursor getRusWords() {
return database.query(Contract.Bluda.TAB_BLUDA,
null,
null,
null,
null, null, null);
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
}
catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try {
checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY);
}
catch (SQLiteException e) {
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null;
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(Contract.DB_NAME);
String outFileName = DB_PATH;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException {
database = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if(database != null)
database.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
CursorRecyclerViewAdapter.java
public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
private Context mContext;
private Cursor mCursor;
private boolean mDataValid;
private int mRowIdColumn;
private DataSetObserver mDataSetObserver;
public CursorRecyclerViewAdapter(Context context, Cursor cursor) {
mContext = context;
mCursor = cursor;
mDataValid = cursor != null;
mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1;
mDataSetObserver = new NotifyingDataSetObserver();
if (mCursor != null) {
mCursor.registerDataSetObserver(mDataSetObserver);
}
}
public Cursor getCursor() {
return mCursor;
}
@Override
public int getItemCount() {
if (mDataValid && mCursor != null) {
return mCursor.getCount();
}
return 0;
}
@Override
public long getItemId(int position) {
if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) {
return mCursor.getLong(mRowIdColumn);
}
return 0;
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(true);
}
public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
@Override
public void onBindViewHolder(VH viewHolder, int position) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
onBindViewHolder(viewHolder, mCursor);
}
public void changeCursor(Cursor cursor) {
Cursor old = swapCursor(cursor);
if (old != null) {
old.close();
}
}
public Cursor swapCursor(Cursor newCursor) {
if (newCursor == mCursor) {
return null;
}
final Cursor oldCursor = mCursor;
if (oldCursor != null && mDataSetObserver != null) {
oldCursor.unregisterDataSetObserver(mDataSetObserver);
}
mCursor = newCursor;
if (mCursor != null) {
if (mDataSetObserver != null) {
mCursor.registerDataSetObserver(mDataSetObserver);
}
mRowIdColumn = newCursor.getColumnIndexOrThrow("_id");
mDataValid = true;
notifyDataSetChanged();
} else {
mRowIdColumn = -1;
mDataValid = false;
notifyDataSetChanged();
}
return oldCursor;
}
private class NotifyingDataSetObserver extends DataSetObserver {
@Override
public void onChanged() {
super.onChanged();
mDataValid = true;
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
super.onInvalidated();
mDataValid = false;
notifyDataSetChanged();
}
}
}
BludaList.java
public class BludaList {
long id;
String bludo;
String recept;
int like;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getBludo() {
return bludo;
}
public void setBludo(String bludo) {
this.bludo = bludo;
}
public String getRecept() {
return recept;
}
public void setRecept(String recept) {
this.recept = recept;
}
public int getLike() {
return like;
}
public void setLike(int like) {
this.like = like;
}
}
BludaAdapter.java
public class BludaAdapter extends CursorRecyclerViewAdapter<BludaAdapter.ViewHolder> {
public BludaAdapter(Context context, Cursor cursor){
super(context,cursor);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ViewHolder(View view) {
super(view);
mTextView = view.findViewById(R.id.text);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false);
ViewHolder vh = new ViewHolder(itemView);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
BludaList bludaList = BludaList.fromCursor(cursor);
viewHolder.mTextView.setText(bludaList.getBludo());
}
}
СontentProviderсовсем не обязательно. Например смотрите этот ответ/ Там в классеMainActivityреализован собственный класс (вложенный)MyCursorLoader, который принимает обычный курсор, а не контентпровайдер. Так же в этом примере используется база из Assets. Пример дляListView, но с таким же успехом вы можете использовать адаптер по ссылке выше дляRecyclerViewИспользовать жеCursorLoaderнастоятельно рекомендуется при работе с SQLite в Android – pavlofff Dec 28 '17 at 07:24