Элемент SQLite не добавляется в базу данных

Я настраиваю базу данных SQLite для своего приложения для Android и хочу поддерживать добавление и удаление элементов RecyclerView. Как я могу исправить свой код, чтобы добавление элементов работало?

Когда я добавляю элементы, они появляются в RecyclerView, но не в базе данных SQLite. Я знаю, что это происходит, потому что, когда я перезапускаю приложение или перехожу к другому фрагменту, RecyclerView становится пустым. Я также проверил файл базы данных SQLite, и он пуст.

Я следил за несколькими учебными пособиями на YouTube по добавлению и удалению элементов в SQLite, но все они, похоже, используют систему «ID», которой нет в моих классах.

Я попытался сослаться на каждый элемент в базе данных SQLite через свойство «имя», которое вы можете увидеть в 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.

Привет, кто бы ни проголосовал за это, почему? Я смог решить свою проблему.

Guy Hoka 05.02.2019 02:16
1
1
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я исправил свою проблему.

После повторного просмотра моего кода в saveStationRecord мне не удалось указать файл COLUMN_NAME.

Вот обновленный код.

public void saveStationRecord(String stationJSON) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    GsonBuilder gsonBuilder = new GsonBuilder();
    Gson gson = gsonBuilder.create();
    //Create a new Station object and use Gson to deserialize JSON data
    //into the Station object
    Station station = gson.fromJson(stationJSON, Station.class);
    values.put(COLUMN_NAME, station.getData().getCity());
    values.put(COLUMN_JSON, stationJSON);
    db.insert(TABLE_NAME, null, values);
    db.close();
}

Я превратил JSON обратно в POJO с помощью Gson, а затем вставил название города в COLUMN_NAME.

Другие вопросы по теме