簡體   English   中英

如何在Android sqlite數據庫中回滾已刪除的行?

[英]How to rollback deleted row in android sqlite database?

我在購物車中添加了一個商品,通過product_id來檢查購物車中是否存在商品,如果商品存在,則更新數量,如果不添加商品,則在購物車中有“活動待處理”按鈕,用戶可以使購物車待定或活動,當用戶單擊購物車“活動”中的待處理按鈕時,購物車將被清除,在待處理活動中,cart1將顯示為待處理,然后當下一個用戶在購物車中添加項目時,第二個購物車將顯示為活動。

但是在我的情況下:-cart1進入待處理狀態,活動中的數據也清除了,但是當試圖從購物車活動中添加購物車中的項目時,它問您是否要更新?而無法創建第二個購物車。

我如何執行此任務:-1.在將數據插入購物車以及將索引為ID的待處理表中插入數據時,如果index_id將存在,則為外鍵,如果插入第二個購物車,則不重復index_id(如果不是index_id將為2)。

但是我認為這個問題是通過執行rollback命令解決的,當用戶使cart1掛起時,數據將通過pend_id刪除,並且當用戶單擊cart1活動按鈕時,將執行rollback命令並添加cart項目。

我將如何執行此代碼,我不知道我已嘗試過該代碼,但無法正常工作

     public void PendingCart(int p_id,String status){
         final SQLiteDatabase db = this.getWritableDatabase();
         try{ db.beginTransaction();
        String update ="Update PendingCart set status=? where status=?";
        String delete = "Delete from PendingCart where P_ID=?";
        String insert= "Select * from PendingCart where P_ID=?";
        String rollback= "rollback";
        db.execSQL(update,new String[]{String.valueOf( status )});
       db.execSQL(delete,new String[]{String.valueOf( p_id )});
        db.execSQL(insert,new String[]{String.valueOf( p_id )});
        db.execSQL( rollback);
//      db.execSQL(insert,new String[]{String.valueOf( p_id )});
         // db.setTransactionSuccessful();
        }catch (Exception e){e.printStackTrace();}finally 
   {db.endTransaction();
         }}
       public List<PendingModel>GetCart_list(){  
       SQLiteDatabase db = this.getWritableDatabase();
       List<PendingModel> list = new ArrayList<>();
       String query= "Select 
 CART.CART_ID,CART.prod_id,CART.Index_id,CART.Barcode,CART.Amount,CART.Grand 
_Total,CART.Quantity,CART.Price,CART.status,PendingCart.P_ID,PendingCart.sta 
us,PendingCart.Created_Date,PRODUCT.Product_Price,Prod_quantity,PRODUCT.PricType,PRODUCT.Item_Name,PRODUCT.Image,PRODUCT.CGST,PRODUCT.SGST from PRODUCT 
       join CART ON CART.prod_id= PRODUCT.prod_id inner join PendingCart ON  
        PendingCart.Customer_ID = CART.Index_id where CART.Index_Id= 
       PENDINGCART.Customer_Id AND PendingCart.status = CART.status";
       Cursor cursor = db.rawQuery( query,null);
       if (cursor.moveToFirst()){try {
       do {
       PendingModel rp = new PendingModel();
       rp.setC_ID( Integer.parseInt( cursor.getString( 0 ) ) );
       rp.setP_id( Integer.parseInt( cursor.getString( 1 ) ) );
        rp.setIndex( cursor.getInt( 2 ));
        rp.setC_barcode(cursor.getString( 3 ));
        rp.setC_Amount( cursor.getFloat( 4) );
        rp.setGrand_Total( cursor.getFloat( 5 ) );
        rp.setC_qunanity( cursor.getFloat( 6) );
        rp.setC_price( cursor.getFloat( 7 ));


 rp.setstatus( cursor.getString( 8 ));
 rp.setP_ID( cursor.getInt( 9 ) ) ;
  rp.setC_status( cursor.getString( 10) );
  rp.setCreated_Date( cursor.getString( 11));
    rp.setP_price( cursor.getFloat( 12 ) )
           rp.setP_quantity( cursor.getFloat( 13) );
       rp.setP_pricetype( cursor.getString( 14 ) );
       rp.setP_name( cursor.getString( 15 ));
      rp.setP_image( cursor.getString( 16 ))

    rp.setP_cgst( cursor.getInt(17 ) );
    rp.setP_sgst( cursor.getInt(18 ) );list.add( rp );} 
    while (cursor.moveToNext());} catch (Exception e) {
     Log.e( "Error", String.valueOf( e ) );
     } finally {
     cursor.close();
     db.close(); } }
    return list}
try {
    db.beginTransaction();
    // your sql stuff
    db.setTransactionSuccessful();
} catch(SQLException e) {
    // do some error handling
} finally {
   db.endTransaction();
}

我認為,即使該應用程序似乎沒有出現故障,您也需要仔細查看日志。

您有效地使用

db.execSQL("Update PendingCart set status=? where status=?",new String[]{String.valueOf( status )});

有兩個占位符 ,因此數組中應該有2個參數,您只需按照new String[]{String.valueOf( status )}傳遞1個參數

  • 我相信這會導致異常(由於您在try / catch / finally結構中而被困)。 但是,接收將記錄在日志中。

即使這不是問題,並且占位符已替換為參數,您也會說通過將狀態從任何狀態更改為任何狀態更新具有任何狀態的所有行 (即不執行任何操作)。 我懷疑您打算使用:-

String update ="Update PendingCart set status=? where P_ID=?";
.....
db.execSQL(update,new String[]{status,String.valueOf( p_id )});

然后通過將狀態列更改為the_new_status_as_per_the_first_parameter成為UPDATE THE ROWS,其中P_ID列為what_the_2nd參數。

刪除看起來不錯(除了更新行然后刪除剛剛更新的行)

插入不會插入任何內容,它是一個根據String insert= "Select * from PendingCart where P_ID=?"; SELECT String insert= "Select * from PendingCart where P_ID=?";的SELECT查詢String insert= "Select * from PendingCart where P_ID=?"; 即使它起作用,也不會使用結果(Cursor)。

然后,如果上述所有操作均未失敗,則可以通過回滾撤消所有更改。 如果遇到異常(因為您未將事務設置為成功),則所有更改將在結束事務時回滾。

因此, PendingCart方法似乎無法執行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM