我创建了一个表,用于将一些收藏的电影列表保存到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,则可以使用favouriteState()函数更改isFavorite变量。
答案 0 :(得分:3)
当您返回insert方法的结果(其rowid或别名)时,可以使用:-
long id = favoriteDbHelper.insertFavorite(fav);
如果该值为-1,则可能是由于约束冲突而未插入行。
根据您的要求,您可能会给 id 更大的范围。
答案 1 :(得分:1)
检查表中是否已存在数据:
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);
}
}
此方法将更新您喜欢的收藏夹(如果存在)或不存在插入ID。