2013-10-10 10 views
2

나는 잠시 동안이 사이트를보고 있었지만 대답을 찾지 못했습니다. 이미 테이블에있는 데이터를 대량 업데이트하려고합니다. 행 ID에 대해 특정 조건이 다시 설정 될 때 설정해야하는 열이 하나 있습니다. 여기에 하나의 방법이 있지만 이것을 더 효율적으로 만들고 대량으로 만들고 싶습니다. 우리 데이터베이스는 Provider에 없으므로 Helper 클래스 만 사용합니다.대량 업데이트 데이터베이스

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 배열을 전달하고 싶습니다. 모든 열 데이터에 액세스 할 수 없으며 너무 많은 코드 변경으로 인해이 코드를 전달하지 않으므로 Insert 또는 Replace 문을 수행 할 수 없습니다. 시도 UPDATE tablename SET column=0 WHERE ID IN (...)

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

답변

8

, ...은 ID 값의 쉼표로 구분 된 목록이다.

+0

이렇게하면 배열을 문자열로 구문 분석해야하며 임의의 길이 배열로 인해 SQL 문이 컴파일되지 않을 수 있습니다. –

+0

@LS_dev : 그런 다음 100 개의 항목마다 하나의 UPDATE를 수행하십시오. – CommonsWare

+0

더 많은 구문 분석이 필요합니다. 나는 그것이 정상적인 데이터베이스 접근 방식이라고 생각하지 않는다. –

7

내가 안드로이드 개발자 아니지만, 좋은 데이터베이스 관행에 따라, 당신이해야 :

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

안드로이드 SQLiteDatabase.update이 경우에 매우 유용 할 것입니다,하지만 String [] whereArgsint[] 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(); 
}