2013-10-10 252 views
2

我一直在寻找这个网站一段时间,但还没有找到答案。我正在尝试对我已知的数据进行批量更新。当某个条件返回行ID时,我需要设置一列。这是单一的方法,但我想使它更高效,并将其作为批量使用。我们的数据库不在提供程序中,所以我只使用助手类。批量更新数据库

public void markUnavailable(int myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    String sql = "UPDATE " + MYTABLE + " SET " + Col.IS_AVAILABLE + "= 0"+ " WHERE " + Col.MY_ID + "=" + myId; 
    db.execSQL(sql); 
    db.close(); 
} 

我想传递一个myIds数组来做批量更新。我无法执行插入或替换语句,因为我无法访问所有列数据,也不想因为代码更改太多而不能传递。

public void markUnavailable(int[] myId) { 
    // ???? 
    /// need some way to loop through and update in bulk 
} 

回答

8

尝试UPDATE tablename SET column=0 WHERE ID IN (...),其中...是逗号分隔的ID值列表。

+0

这将需要将数组解析为字符串,并且任意长度的数组可能会阻止SQL语句进行编译。 –

+0

@LS_dev:然后为每个例如10​​0个条目做一个“UPDATE”。 – CommonsWare

+0

需要更多解析。我不认为这应该是一个正常的数据库方法。 –

7

我不是一个Android开发者,但根据良好的数据库的做法,你应该:

public void markUnavailable(int[] myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.beginTransaction(); 
    SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?"; 
    for (int i = 0; i < myId.length; i++) { 
     upd.bindLong(1, myId[i]); 
     upd.execute(); 
    } 
    db.endTransaction(); 
} 

Android有SQLiteDatabase.update会在这种情况下非常有用,但String [] whereArgs不会与你int[] myId处理好。

2

执行批量更新的最快方法是通过使用开始和结束事务将其作为单个事务执行。另外,如果数据库的大小很大,将myID作为表的主键是一个好主意,因为当使用WHERE子句时,它将显着提高获取行的更新速度[It据说索引可以降低更新和插入的速度,但是当使用where子句时,索引一直以巨大的利润率提高了我的速度。

public void markUnavailable(int[] myId) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.beginTransaction(); 
    SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?"); 
    for (int i = 0; i < myId.length; i++) { 
     upd.clearBindings(); 
     upd.bindLong(1, myId[i]); // this matches the first "?" 
     upd.execute(); 
    } 
    db.setTransactionSucessful(); 
    db.endTransaction(); 
}