在db.update()过程中获得的打印结果中,打印0

时间:2018-09-20 09:35:29

标签: android android-sqlite

在打印更新值期间,它始终返回0,并且数据库未更新。我想更新这个数据库。是否有其他任何过程来更新此数据库。是否使用此方法更新数据库?

public void upgradealldata(String latco, String lngco,
    String locationco, String coll,String conv,String remark, 
    String del_activity,String service_issues,String comp_activity, 
    String image, String image1,String order_details,String 
    closing_stock,String checkout_time,String distance_travelled, 
    String payimg, String payrem)
    {
    SQLiteDatabase db = getWritableDatabase();
    try
     {
    ContentValues cvalues = new ContentValues();
    cvalues.put(LATITUDE_CHKOUT, latco);
    cvalues.put(LONGITUDE_CHKOUT, lngco);
    cvalues.put(LOCATION_CHKOUT, locationco);
    cvalues.put(COLLECTION, coll);
    cvalues.put(CONVEYANCE, conv);
    cvalues.put(REMARK, remark);
    cvalues.put(SERVICE_ISSUES, service_issues);
    cvalues.put(IMAGE, image);
    cvalues.put(IMAGE1, image1);
    cvalues.put(ORDER_DETAILS, order_details);
    cvalues.put(CLOSING_STOCK, closing_stock);
    cvalues.put(CHECKOUT_TIME, checkout_time);
    cvalues.put(DISTANCE_TRAVELLED, distance_travelled);
    cvalues.put(DEL_ACTIVITY, del_activity);
    cvalues.put(COMP_ACTIVITY, comp_activity);
    cvalues.put(CHO_PYMENTIMAGE, payimg);
    cvalues.put(CHO_PAYMENTREMARK, payrem);

    int result = db.update(TABLE_ALLSENDDETAILS,cvalues,
    LATITUDE_CHKOUT+" =? and "+LONGITUDE_CHKOUT+" =? and
    "+LOCATION_CHKOUT+" =? and "+COLLECTION+" =? and
    "+CONVEYANCE+"=? and "+REMARK+" =? and "+SERVICE_ISSUES+" =?
    and "+IMAGE+" =? and "+IMAGE1+" =? and "+ORDER_DETAILS+" =?
    and "+CLOSING_STOCK+" =? and "+CHECKOUT_TIME+" =? and
    "+DISTANCE_TRAVELLED+" =? and "+DEL_ACTIVITY+" =? and
    "+COMP_ACTIVITY+" =? and "+CHO_PYMENTIMAGE+" =? and 
    "+CHO_PAYMENTREMARK+" =?",new String[]{
    latco,lngco,locationco,coll,conv,remark,service_issues,
    image,image1,order_details,closing_stock,checkout_time,
    distance_travelled,del_activity, comp_activity,payimg,payrem
}

);
    System.out.println("UpdateValue====>"+String.valueOf(result));
    db.close();
    }
    catch (SQLiteException e){
     e.printStackTrace();
    }
    finally{
    db.close();
    }
    }

1 个答案:

答案 0 :(得分:0)

您传递给该方法的值(即您要用来更新行的值)与用于标识要更新的行的值相同。

您可能想要一些类似的东西:-

public void upgradealldata(String latco, String lngco, String 
    locationco, String coll,String conv, String remark,                               
    String del_activity, String service_issues, String comp_activity,
    String image, String image1, String order_details, String 
    closing_stock,String checkout_time, String distance_travelled, 
    String payimg, String payrem,


    // ADDED parameters for the original values of the row
    String old_latco, String old_lngco, String 
    old_locationco, String old_coll,String old_conv, String old_remark,                               
    String old_del_activity, String old_service_issues, String old_comp_activity,
    String old_image, String old_image1, String old_order_details, String 
    old_closing_stock,String old_checkout_time, String old_distance_travelled, 
    String old_payimg, String old_payrem)
{      
    SQLiteDatabase db = getWritableDatabase();

    try
    {
       ContentValues cvalues = new ContentValues();
       cvalues.put(LATITUDE_CHKOUT, latco);
       cvalues.put(LONGITUDE_CHKOUT, lngco);
       cvalues.put(LOCATION_CHKOUT, locationco);
       cvalues.put(COLLECTION, coll);
       cvalues.put(CONVEYANCE, conv);
       cvalues.put(REMARK, remark);
       cvalues.put(SERVICE_ISSUES, service_issues);
       cvalues.put(IMAGE, image);
       cvalues.put(IMAGE1, image1);
       cvalues.put(ORDER_DETAILS, order_details);
       cvalues.put(CLOSING_STOCK, closing_stock);
       cvalues.put(CHECKOUT_TIME, checkout_time);
       cvalues.put(DISTANCE_TRAVELLED, distance_travelled);
       cvalues.put(DEL_ACTIVITY, del_activity);
       cvalues.put(COMP_ACTIVITY, comp_activity);
       cvalues.put(CHO_PYMENTIMAGE, payimg);
       cvalues.put(CHO_PAYMENTREMARK, payrem);

       int result = db.update(TABLE_ALLSENDDETAILS,cvalues, 
       LATITUDE_CHKOUT+" =? and "+LONGITUDE_CHKOUT+" =? and 
       "+LOCATION_CHKOUT+" =? and "+COLLECTION+" =? and "+CONVEYANCE+" 
       =? and "+REMARK+" =? and "+SERVICE_ISSUES+" =? and "+IMAGE+" =? 
       and "+IMAGE1+" =? and "+ORDER_DETAILS+" =? and 
       "+CLOSING_STOCK+" =? and "+CHECKOUT_TIME+" =? and 
       "+DISTANCE_TRAVELLED+" =? and "+DEL_ACTIVITY+" =? and 
       "+COMP_ACTIVITY+" =? and "+CHO_PYMENTIMAGE+" =? and 
       "+CHO_PAYMENTREMARK+" =?",

        new String[{old_latco,old_lngco,old_locationco,old_coll,old_conv,old_remark,old_service_issues,old_image,old_image1,old_order_details,old_closing_stock,old_checkout_time,old_distance_travelled,old_del_activity,old_comp_activity,old_payimg,payrem});
        System.out.println("UpdateValue====>"+String.valueOf(result));
        db.close();

    } catch (SQLiteException e)
    {
       e.printStackTrace();
    } finally {
        db.close();
    }

}
  • 然后将要更新的行的值作为以old_为前缀的参数传递。

但是,这是为什么经常使用 id 列(即唯一标识符,例如 rowid 的别名)的原因之一,因此您可以仅通过单个值来识别特定行。

其他

评论

  

此表在插入期间首先包含28列   操作插入的前5列值,其余列插入空白   数据之后,我想用数据更新其余的23列。   可能在这里吗?

这确认您遇到的问题是WHERE子句不会找到要更新的行,因此更新为什么返回0(即0行已更新)。

简而言之,您必须能够标识要更新的行。

可能的解决方案1。

如果您有UNIQUE列或UNIQUE组合列,请标识要更新的行

如果用UNIQUE定义了5列中的任何一列,则可以在WHERE子句中使用该列,例如(例如,假设lacto被定义为lacto TEXT UNIQUE),则可以使用:-

public void upgradealldata( string lacto, String lngco, .... the other columns..... Strain payrem,

    String old_lacto) {

    ..... code for setting the ContentValues as it is .....

    String whereclausae = LATITUDE_CHKOUT+" =?";
    String[] whereargs = new String[]{old_lacto};
    int result = db.update(TABLE_ALLSENDDETAILS,cvalues,whereclause,whereargs);
    System.out.println("UpdateValue====>"+String.valueOf(result));
    db.close();
}

如果合并的5列中有许多列被定义为UNIQUE或绝对将是UNIQUE作为组合,则可以将原始(old_)值传递给该方法,并将这些列用于WHERE子句和参数。

可能的解决方案2

通过rowid或rowid的别名标识要更新的行

表不得已定义为WITHOUT ROWID表。

如果没有任何列或列组合绝对总是唯一的,则可以使用行的 rowid 列(只要您尚未将表定义为不包含rowid的表(也就是说,表是使用WITHOUT ROWID关键字定义的))。

如果您将列定义为the_column_name INTEGER PRIMARY KEYthe_column_name INTEGER PRIMARY KEY AUTOINCREMENT,则该列将是 rowid 列的别名,因此可以使用_column_name。

  • * the_column_name 不是实际名称,它表示任何有效的列名称。例如您可能有id INTEGER PRIMARY KEY,所以 id 是由 the_column_name 表示的列名。

因此,无论哪种情况,您都有一个可以标识1个特定行的列名。

从插入的行中获取要更新的rowid或别名的值

使用SQLiteDatabase insert 方法插入行时可以获得此值,因为它是从插入返回的值,例如long id_of_the_insert_row = db.insert(.....或可以运行查询{{1} }例如

SELECT last_insert_rowid();

upgradealldata 方法可能类似于:-

log id_of_the_last_inserted_row = 0;
Cursor csr = db.rawQuery("SELECT last_insert_rowid()",null);
if (csr.moveToFirst()) {
    id_of_the_last_inserted_row = csr.getLong(0);
} 
  • 无论您是否为 rowid 列添加别名,以上内容都可以工作

如果您为 rowid 列添加了别名(假设它被定义为常量ID_COLUMN(例如,您拥有public void upgradealldata( string lacto, String lngco, .... the other columns..... Strain payrem, long rowid_or_alias) { ..... code for setting the ContentValues as it is ..... String whereclausae "rowid=?"; String[] whereargs = new String[]{String.valueOf(rowid_or_alias)}; int result = db.update(TABLE_ALLSENDDETAILS,cvalues,whereclause,whereargs); System.out.println("UpdateValue====>"+String.valueOf(result)); db.close(); } ),则可以使用:-

public static final String ID_COLUMN = "id"
  • 注意 .....(点/句点代表原始代码中的代码)
  • 附加说明上面的代码是原则代码。它未经测试,可能包含错误。