2014-05-21 3 views
0

내 기능 중 일부는 모든 행의 값을 업데이트해야합니다 (사용자가 특정 설정을 선택할 때 드물게 발생 함).SQLite 업데이트 쿼리 최적화

문제는 쿼리가 수행하는 데 몇 분이 걸리는데 기껏해야 269 개의 ​​테스트 레코드 만 있다는 것입니다. 이것이 최적화 될 수있는 방법이 있습니까?

String allRecords = "SELECT id, weight FROM Workout_Entry"; 

    Cursor cursor = db.rawQuery(allRecords, null); 

    int rows = cursor.getCount(); 

    int id; 
    double weight; 

    try 
    { 
     if (cursor.moveToFirst()) 
     { 
      do 
      { 
       for (int i = 0; i < rows; i++) 
       { 
        id = cursor.getInt(0); 
        weight = cursor.getInt(1)/2.2; 

        String strFilter = "id = " + id; 
        ContentValues args = new ContentValues(); 
        args.put("weight", weight); 

        db.update("Workout_Entry", args, strFilter, null); 

       } 

      } while (cursor.moveToNext()); 
     } 
    } finally 
    { 
     cursor.close(); 
    } 

    (db).close(); 

고마워요!

답변

0

좋아, 나는 내 실수를 깨달았다. 나는 모든 레코드에 대해 do while 루프를 가지고 있었고, 그 안에는 x을 여러 번 반복 한 for loop이있었습니다. 여기서 x은 기존 레코드의 양이었습니다.

그래서 O(n) 대신에 O(n)² 번을 통과했습니다.

답장을 보내 주신 분들께 감사드립니다. 나는 당신의 의견이 모두 유용하다는 것을 알았다.

2

한 번에 한 행씩 데이터를 가져와 매번 새 업데이트 쿼리를 실행하는 대신 작업을 데이터베이스 엔진으로 밀어 넣기 만하면됩니다. 이것은, 통계/제국 단위 변환의 일종 데이터베이스에 하나의 형식으로 데이터를 유지하는 고려에 해당하는 장치로/포맷을 변환하는 것 때문에, 또한

db.execSQL("UPDATE Workout_Entry SET weight=weight/2.2"); 

: 같은 것을 사용하여 코드를 바꿉니다 표시 목적.

+0

사실 나는 이것이 특정 문제에 대한보다 정확한 해결책이라고 동의합니다. +1 –

1

트랜잭션을 사용하는 법을 배워야합니다.이 사용 방법에 대한 예제는 presentation of mine에서 볼 수 있습니다.

또한 트랜잭션을 사용하지 않을 경우의 영향을 보여줍니다.

+0

매우 유용합니다. 감사합니다. – Smittey