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

Having problems with inserting data into sqlite as new details are replacing all other rows with the newly entered details

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

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

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

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();
    }

} 

下面是 activity,它有一个图像按钮,可用于将交易添加到数据库中。原始交易来自 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;
}