Как сохранить данные в базе данных SQLite и проверить, существуют ли данные с идентификатором - PullRequest
1 голос
/ 02 июля 2019

Я создал таблицу для сохранения списка избранных фильмов в базе данных SQLite.Появится звездное меню, которое переведет элемент просмотра переработчика в избранное состояние.

FavoriteHelper.java

public static final String DATABASE_TABLE = TABLE_FAVORITE;
private static DatabaseHelper databaseHelper;
private static FavoriteHelper INSTANCE;

public static SQLiteDatabase database;

public FavoriteHelper(Context context){
    databaseHelper = new DatabaseHelper(context);
}

public static FavoriteHelper getInstance(Context context){
    if(INSTANCE == null){
        synchronized (SQLiteOpenHelper.class){
            if(INSTANCE == null){
                INSTANCE = new FavoriteHelper(context);
            }
        }
    }
    return INSTANCE;
}

public void open() throws SQLException{
    database = databaseHelper.getWritableDatabase();
}

public void close(){
    databaseHelper.close();

    if(database.isOpen()){
        database.close();
    }
}

public ArrayList<Movie> getAllFavorites(){
    ArrayList<Movie> arrayList = new ArrayList<>();
    Cursor cursor = database.query(DATABASE_TABLE, null,
            null,
            null,
            null,
            null,
            _ID + " ASC",
            null);
    cursor.moveToFirst();
    Movie favorite;
    if(cursor.getCount() > 0){
        do {
            favorite = new Movie();
            favorite.setId(cursor.getInt(cursor.getColumnIndexOrThrow(_ID)));
            favorite.setTitle(cursor.getString(cursor.getColumnIndexOrThrow(TITLE)));
            favorite.setOriginalTitle(cursor.getString(cursor.getColumnIndexOrThrow(ORIGINAL_TITLE)));
            favorite.setRating(cursor.getString(cursor.getColumnIndexOrThrow(RATING)));
            favorite.setReleaseDate(cursor.getString(cursor.getColumnIndexOrThrow(RELEASE_DATE)));
            favorite.setOverview(cursor.getString(cursor.getColumnIndexOrThrow(OVERVIEW)));
            favorite.setPhotoLink(cursor.getString(cursor.getColumnIndexOrThrow(PHOTO_LINK)));

            arrayList.add(favorite);
            cursor.moveToNext();

        } while (!cursor.isAfterLast());
    }
    cursor.close();
    return arrayList;
}

public long insertFavorite(Movie favorite){
    ContentValues args = new ContentValues();
    args.put(TITLE, favorite.getTitle());
    args.put(ORIGINAL_TITLE, favorite.getOriginalTitle());
    args.put(RATING, favorite.getRating());
    args.put(RELEASE_DATE, favorite.getReleaseDate());
    args.put(OVERVIEW, favorite.getOverview());
    args.put(PHOTO_LINK, favorite.getPhotoLink());
    return database.insert(DATABASE_TABLE, null, args);
}

public int deleteFavorite(int id){
    return database.delete(TABLE_FAVORITE, _ID + " = '" + id + "'", null);
}

DetailActivity.java

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.detail_menu, menu);
    menuItem = menu;
    setFavorite();
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch(item.getItemId()){
        case R.id.add_to_favorite_button:
            if(isFavorite) removeFavorite(); else saveFavorite();
            isFavorite = !isFavorite;
            setFavorite();
            return true;
    }
    Intent intent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(intent, 0);
    return true;
}    
private void favoriteState(){
    String results = String.format("SELECT * FROM favorite WHERE _ID=%s",ids);
    if(results != null) isFavorite = true;
}

private void saveFavorite(){
    FavoriteHelper favoriteDbHelper = new FavoriteHelper(this);
    favoriteDbHelper.open();

    Movie fav = new Movie();
    fav.setId(ids);
    fav.setTitle(titleBar);
    fav.setOriginalTitle(nameDetail.getText().toString());
    fav.setRating(rateDetail.getText().toString());
    fav.setReleaseDate(dateDetail.getText().toString());
    fav.setOverview(descDetail.getText().toString());
    fav.setPhotoLink(tvImageView.getText().toString());

    favoriteDbHelper.insertFavorite(fav);
    favoriteDbHelper.close();
}

private void removeFavorite(){
    FavoriteHelper favoriteHelper = new FavoriteHelper(this);
    favoriteHelper.open();
    favoriteHelper.deleteFavorite(ids);
    favoriteHelper.close();
}

private void setFavorite(){
    if(isFavorite){
        menuItem.getItem(0).setIcon(ContextCompat.getDrawable(this, R.drawable.ic_added_to_favorites));
    }else{
        menuItem.getItem(0).setIcon(ContextCompat.getDrawable(this, R.drawable.ic_add_to_favorites));
    }
}

Но каждый раз, когда я нажимаю кнопку, данные не сохраняются в таблицу.Как сохранить данные в таблице и проверить, существуют ли данные в этой таблице, поэтому, если я перейду к DetailActivity с данными, существует, переменная isFavorite может быть изменена с помощью функции FavoritesState ().

Ответы [ 2 ]

3 голосов
/ 02 июля 2019

Когда вы возвращаете результат метода insert (rowid или его псевдоним), вы можете использовать: -

 long id = favoriteDbHelper.insertFavorite(fav);
  • Если значение id больше 0, тогда строка была вставлена, и значением будет значение rowid и, следовательно, псевдоним rowid , если он есть (обычноваш _ID будет псевдонимом rowid ).
  • Если значение равно -1, строка не была вставлена ​​и, вероятно, из-за конфликта ограничений.

  • Возможно, вы дадите id больше возможностей, в зависимости от ваших требований.

1 голос
/ 02 июля 2019

Проверьте, существуют ли данные в таблице:

public boolean isDataAvailable(String title) {
        SQLiteDatabase db = this.getWritableDatabase();

        boolean isAvailable = false;

        try {
            Cursor cursor;
            String sql = "SELECT * FROM " + TABLE_NAME + " WHERE fav_id =" + id; // you can check it by comparing any unique value 
            cursor = db.rawQuery(sql, null);
            isAvailable = cursor.getCount() > 0;
            cursor.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return isAvailable;
    }

Измените метод вставки на:

public insertFavorite(Movie favorite) {
        ContentValues args = new ContentValues();
        args.put(TITLE, favorite.getTitle());
        args.put(ORIGINAL_TITLE, favorite.getOriginalTitle());
        args.put(RATING, favorite.getRating());
        args.put(RELEASE_DATE, favorite.getReleaseDate());
        args.put(OVERVIEW, favorite.getOverview());
        args.put(PHOTO_LINK, favorite.getPhotoLink());

        if (isDataAvailable(favorite.getTitle())) {
            database.update(DATABASE_TABLE, args, "title = " + favorite.getTitle(), null);
        } else {
            database.insert(DATABASE_TABLE, null, args);
        }

    }

Этот метод обновит ваш любимый, если он существует или вставьте идентификатор не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...