在将数据插入sqlite时遇到问题,因为新的详细信息会用新输入的详细信息替换所有其他行



我的sqlite数据库有一些问题,作为应用程序的一部分,我必须保存用户最喜欢的交易,因此我将它们插入sqlite数据库。所发生的情况是,将使用新的Favorited交易的详细信息创建一个新行,但它也会使用新添加的交易的相同详细信息更新所有现有行。

我看了很多网站,但似乎无法修复。你能帮帮我吗?

下面是我的数据库助手类:

public class DatabaseHelper extends SQLiteOpenHelper{
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "unilife";
// Login table name
private static final String TABLE_LOGIN = "login";
// Login Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_EMAIL = "email";
private static final String KEY_USERNAME = "username";
private static final String KEY_USER_ID = "userid";
public static final String TABLE_DEAL= "deal";
public static final String KEY_DEAL_ID = "dealid";
public static final String KEY_DEAL_TITLE = "dealtitle";
public static final String KEY_START_DATE = "startdate";
public static final String KEY_EXPIRY_DATE = "expirydate";
public static final String KEY_DETAILS = "details";
public static final String KEY_PHOTO = "photo";
public static final String KEY_DEAL_VENDOR_ID = "vendorid";
public DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// create the database tables
@Override
public void onCreate(SQLiteDatabase db){
String loginSQL = "CREATE TABLE " + TABLE_LOGIN + "("
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_USER_ID + " TEXT, "
+ KEY_NAME + " TEXT,"
+ KEY_USERNAME + " TEXT,"
+ KEY_EMAIL + " TEXT UNIQUE )";
db.execSQL(loginSQL);
String dealSQL = "CREATE TABLE " + TABLE_DEAL + " ("
+ KEY_ID + " INTEGER PRIMARY KEY, "
+ KEY_DEAL_ID + " TEXT, "
+ KEY_DEAL_TITLE + " TEXT, "
+ KEY_START_DATE + " TEXT, "
+ KEY_EXPIRY_DATE + " TEXT, "
+ KEY_DETAILS + " TEXT, "
+ KEY_PHOTO + " TEXT, "
+ KEY_DEAL_VENDOR_ID + " TEXT )";
Log.i("DBHELPER", dealSQL);
db.execSQL(dealSQL);
}
// upgrading database
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
// delete the old table
db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN);
db.execSQL("DROP TABLE IF EXISTS " + TABLE_DEAL);
// create tables again
onCreate(db);
}

public void addFavourite(String dealid, String dealtitle, String startdate,
String expirydate, String details, String photo , `enter code here`String vendorid){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(KEY_DEAL_ID, dealid);
cv.put(KEY_DEAL_TITLE, dealtitle);
cv.put(KEY_START_DATE, startdate);
cv.put(KEY_EXPIRY_DATE, expirydate);
cv.put(KEY_DETAILS, details);
cv.put(KEY_PHOTO, photo);
cv.put(KEY_DEAL_VENDOR_ID, vendorid);
Log.i("DBHELPER", dealtitle);
db.insert(TABLE_DEAL, null, cv);
db.close();
}
public ArrayList<HashMap<String, String>> getFavourites() {
ArrayList<HashMap<String, String>> allfavourites = new ArrayList<HashMap<String, String>>();
HashMap<String, String> favourite = new HashMap<String, String>();
String query = "SELECT * FROM " + TABLE_DEAL;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()){
do {
favourite.put("dealid", cursor.getString(1));
favourite.put("dealtitle", cursor.getString(2));
favourite.put("startdate", cursor.getString(3));
favourite.put("expirydate", cursor.getString(4));
favourite.put("details", cursor.getString(5));
favourite.put("photo", cursor.getString(6));
favourite.put("vendorid", cursor.getString(7));
allfavourites.add(favourite);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return allfavourites;
}

/*public void removeFromFavourites(String dealid){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_DEAL, KEY_DEAL_ID + " = " + dealid , null);
db.close();
}*/
public void removeFromFavourites(Deal deal){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_DEAL, KEY_ID + " = ?" , new String[]{String.valueOf(deal.getId())});
db.close();
}
} 

下面是一个具有image按钮的活动,该按钮将用于将交易添加到数据库中。最初的交易来自json请求。

public class DealsDetailActivity extends Activity  {
String dealid ;
String dealtitle ;
String startdate;
String expirydate ;
String details ;
String dealvendorid ;
String vendorphoto;
public String sDealid;
private DatabaseHelper helper;
private SQLiteDatabase db;
private ImageButton favouritesBtn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detail_deals);
Intent i = getIntent();
sDealid = i.getStringExtra(TAG_DEAL_ID);
getPostsForVendor();
dealid = i.getStringExtra(TAG_DEAL_ID);
dealtitle = i.getStringExtra(TAG_DEAL_TITLE);
startdate = i.getStringExtra(TAG_START_DATE);
expirydate = i.getStringExtra(TAG_EXPIRY_DATE);
details = i.getStringExtra(TAG_DEAL_DESC);
dealvendorid = i.getStringExtra(TAG_DEAL_VENDOR_ID);
vendorphoto = i.getStringExtra(TAG_VENDOR_PHOTO);
TextView title = (TextView)findViewById(R.id.deal_details_deal_name);
title.setText(dealtitle);
TextView date = (TextView)findViewById(R.id.deal_details_expiry_date);
date.setText(startdate + " - " + expirydate);
TextView desc = (TextView)findViewById(R.id.deal_details_deal_desc);
desc.setText(details);
final ImageView photo = (ImageView)findViewById(R.id.deal_details_place_pic);
Bitmap bitmap = ListViewAdapter.getBitmapFromURL(vendorphoto);
photo.setImageBitmap(bitmap);
postbtn = (Button)findViewById(R.id.post_btn);
postbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(DealsDetailActivity.this, AddPostActivity.class);
i.putExtra(TAG_DEAL_ID, dealid);
i.putExtra(TAG_DEAL_VENDOR_ID, dealvendorid);
i.putExtra(TAG_DEAL_TITLE, dealtitle);
i.putExtra(TAG_VENDOR_PHOTO, vendorphoto);
startActivity(i);
}
});
///////////////////////////////////////////////////////////////////////
// this is where the deals would be added to the database so that if //
// the favourite button is clicked then it would be inserted         //
// into the database                                                 //
// i tried to insert to the database directly here as well as        //
// previously trying to insert with the database method addfavourites// 
///////////////////////////////////////////////////////////////////////
favouritesBtn = (ImageButton)findViewById(R.id.deals_details_fav);
favouritesBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Set the button's appearance
v.setSelected(!v.isSelected());
if (v.isSelected()) {
//Handle selected state change
helper = new DatabaseHelper(getApplicationContext());
db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(DatabaseHelper.KEY_DEAL_ID, dealid);
cv.put(DatabaseHelper.KEY_DEAL_TITLE, dealtitle);
cv.put(DatabaseHelper.KEY_START_DATE, startdate);
cv.put(DatabaseHelper.KEY_EXPIRY_DATE, expirydate);
cv.put(DatabaseHelper.KEY_DETAILS, details);
cv.put(DatabaseHelper.KEY_PHOTO, vendorphoto);
cv.put(DatabaseHelper.KEY_DEAL_VENDOR_ID, dealvendorid);
db.insert(DatabaseHelper.TABLE_DEAL, null, cv);
Log.e(HomeActivity.TAG, "THE ARRAYLIST OUTPUT: " + cv);
helper.close();
db.close();
Toast.makeText(getApplicationContext(), "Deal added to Favourites", Toast.LENGTH_LONG).show();
} else {
//Handle de-select state change
helper = new DatabaseHelper(getApplicationContext());
helper.getReadableDatabase();
// helper.removeFromFavourites(deal);
Toast.makeText(getApplicationContext(), "Deal Removed from Favourites", Toast.LENGTH_LONG).show();
}
}
});
}

你能帮忙吗,因为我好像不知道哪里出了问题。我以前以同样的方式使用数据库,这种情况以前从未发生过。

提前感谢:)

我认为问题出在getFavorites中。您没有在循环中重新初始化Map。

public ArrayList<HashMap<String, String>> getFavourites() {
ArrayList<HashMap<String, String>> allfavourites = new ArrayList<HashMap<String, String>>();
String query = "SELECT * FROM " + TABLE_DEAL;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(query, null);
if (cursor.moveToFirst()) {
do {
HashMap<String, String> favourite = new HashMap<String, String>();
favourite.put("dealid", cursor.getString(1));
favourite.put("dealtitle", cursor.getString(2));
favourite.put("startdate", cursor.getString(3));
favourite.put("expirydate", cursor.getString(4));
favourite.put("details", cursor.getString(5));
favourite.put("photo", cursor.getString(6));
favourite.put("vendorid", cursor.getString(7));
allfavourites.add(favourite);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return allfavourites;
}

相关内容

最新更新