Я настраиваю базу данных SQLite для своего приложения для Android и хочу поддерживать добавление и удаление элементов RecyclerView.Как я могу исправить свой код так, чтобы добавление элементов работало?
Когда я добавляю элементы, они появляются в RecyclerView, но не в базе данных SQLite.Я знаю, что это происходит потому, что при перезапуске приложения или переходе к другому фрагменту RecyclerView становится пустым.Я также проверил файл базы данных SQLite, и он пуст.
Я следовал нескольким учебникам на YouTube по добавлению и удалению элементов в SQLite, но все они, похоже, используют систему «ID», которой у моих классов нет..
Я пытался ссылаться на каждый элемент в базе данных SQLite через свойство "name", которое вы можете увидеть в COLUMN_NAME
.Он будет содержать название города, которое представляет собой строку.
Элементы, которые я добавляю в свой RecyclerView, - это POJO, сгенерированный из JSON.
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "stations.db";
private static final int DATABASE_VERSION = 3;
public static final String TABLE_NAME = "Station";
public static final String COLUMN_NAME = "_name";
public static final String COLUMN_JSON = "json";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(" CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_NAME + " BLOB NOT NULL, " +
COLUMN_JSON + " BLOB NOT NULL);"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// you can implement here migration process
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
this.onCreate(db);
}
/**
* Returns all the data from database
* @return
*/
public Cursor getData(){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_NAME;
Cursor data = db.rawQuery(query, null);
return data;
}
/**
* create record
**/
public void saveStationRecord(String stationJSON) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_JSON, stationJSON);
db.insert(TABLE_NAME, null, values);
db.close();
}
/**
* delete record
**/
public void deleteStationRecord(String name, Context context) {
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_NAME + " WHERE _name='" + name + "'");
}
ListAdapter.java (адаптер RecyclerView)
public void removeItem(int position) {
Station station = stationList.get(position);
DatabaseHelper dbHelper = new DatabaseHelper(context);
dbHelper.deleteStationRecord(station.getData().getCity(), context);
stationList.remove(position);
// notify item added by position
notifyItemRemoved(position);
//notifyItemRangeChanged(position, stationList.size());
}
ListFragment.java (где отображается RecyclerView)
@Override
public void onStart() {
super.onStart();
//loadDataFromFirebase();
loadDataFromSQLiteDatabase();
}
public void addData(String data) {
databaseHelper = new DatabaseHelper(getActivity());
databaseHelper.saveStationRecord(data);
}
private void loadDataFromSQLiteDatabase() {
//Get the JSON data with the DatabaseHelper class
Cursor data = databaseHelper.getData();
//Using Gson to turn JSON to Java object of Station
//Create new GsonBuilder and Gson objects
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
while (data.moveToNext()) {
//Get the next JSON from the database
String jsonResponse = data.getString(1);
//Create a new Station object and use Gson to deserialize JSON data
//into the Station object
Station station = gson.fromJson(jsonResponse, Station.class);
//Add the new Station object to the ArrayList of Station objects
//This is to create another entry in the RecyclerView
//Tell the RecyclerView listAdapter that our data is updated
//because Station was just to the ArrayList
stationList.add(station);
}
}
private void loadSelectedDataToRecyclerView(String selectedStation) {
RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET, generateRequestURL(selectedStation),
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
Station station = gson.fromJson(response, Station.class);
stationList.add(station);
listAdapter.notifyDataSetChanged();
//Add the new Station object to SQLite database
addData(response);
Log.d("API RESPONSE", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VOLLEY ERROR", error.toString());
}
});
requestQueue.add(stringRequest);
}
Я ожидаю, что элемент, который был добавлен в RecyclerView, также будет добавлен вбазы данных SQLite, чтобы при повторном запуске приложения или переходе к другому фрагменту элемент оставался в RecyclerView.