2011-07-12 6 views
0

私は単純な構造を持っており、私のデータベースのレコードを更新するのに時間がかかりすぎることに気付きました。OrmLiteで遅い更新

これは私のデータクラスが定義されている方法です。

public static final String TILE_MAP_UNIQUE_ID_FIELD_NAME = "tileMap_unique_id"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false) 
int tileMap_unique_id; 
public static final String TILE_MAP_LEVEL_ID_FIELD_NAME = "tileMap_level_id"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false) 
String tileMap_level_id; 
public static final String COLUMN_FIELD_NAME = "column"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false) 
long column; 
public static final String ROW_FIELD_NAME = "row"; 
@DatabaseField (uniqueIndexName = "unique_tileMapCache", canBeNull = false) 
long row; 
public static final String IMAGE_DATA_FIELD_NAME = "image_data"; 
@DatabaseField (dataType = DataType.BYTE_ARRAY, index = true, canBeNull = false) 
byte[] image_data; 
public static final String IMAGE_DATA_LENGHT_FIELD_NAME = "image_data_lenght"; 
@DatabaseField (index = true, canBeNull = false) 
int image_data_lenght; 
public static final String DATE_CREATED_FIELD_NAME = "date_created"; 
@DatabaseField(index = true, canBeNull = false) 
Date date_created; 
public static final String DATE_LAST_ACCESSED_FIELD_NAME = "date_last_accessed"; 
@DatabaseField(index = true, canBeNull = false) 
Date date_last_accessed; 
public static final String ACCESSED_COUNTER = "accessed_counter"; 
@DatabaseField(index = true, canBeNull = false) 
int accessed_counter; 

そしてこれはどこかで自分のアプリケーションでの更新ステートメントである:

Dao<TileMapCacheData, Integer> updateTileMapCacheDataDao = dbHelper.getTileMapCacheDataDao(); 
UpdateBuilder<TileMapCacheData, Integer> updateBuilder = updateTileMapCacheDataDao.updateBuilder(); 
updateBuilder.updateColumnValue(TileMapCacheData.DATE_LAST_ACCESSED_FIELD_NAME, new Date()); 
updateBuilder.updateColumnValue(TileMapCacheData.ACCESSED_COUNTER, record.accessed_counter + 1); 
updateBuilder.where() 
.eq(TileMapCacheData.TILE_MAP_UNIQUE_ID_FIELD_NAME, tileMap.getUniqueId()) 
.and() 
.eq(TileMapCacheData.TILE_MAP_LEVEL_ID_FIELD_NAME, tileMap.getLevelId(tileImage.tile.level)) 
.and() 
.eq(TileMapCacheData.COLUMN_FIELD_NAME, tileImage.tile.column) 
.and() 
.eq(TileMapCacheData.ROW_FIELD_NAME, tileImage.tile.row); 
updateTileMapCacheDataDao.update(updateBuilder.prepare()); 

SQLは次のようになります。

UPDATE `tilemapcachedata` SET `date_last_accessed` = ? ,`accessed_counter` = 11 WHERE (((`tileMap_unique_id` = -1902272760 AND `tileMap_level_id` = '5') AND `column` = 24) AND `row` = -6) 

問題がどこにあるかは誰か分かりますか? .update()は数秒かかるため、即座に実行する必要があります。

いい考えがあります。

+0

私の回答は、@ no9であなたを助けましたか? – Gray

答えて

2

私が見ている唯一の事は、byte[] image_data;というフィールドは、物事を遅くする大きな価値があるかもしれないということです。しかし、あなたが表示するアップデートはimage_dataフィールドに触れていないので、なぜそれがどうして長くかかるのか分かりません。

ORMLiteでのロギングの一部を有効にして、どこに時間が掛かっているか把握できるかどうかを確認することをお勧めします。 http://ormlite.com/docs/logging

また、このテーブルには、byte[] image_dataのインデックスが含まれています。あなたが本当に必要でない限り、これらのインデックスのいくつかを削除することを検討するかもしれません。

+0

部分的。問題は、一部の電話機では正常に動作し、一部の機種では遅く動作するということです。 – no9

+0

違いを見つけたらお知らせください。 – Gray

+0

Log4jを使用している場合、あなたのsrc/main/resourcesにlog4j.propertiesファイルを置くことができます。ロギングドキュメントには、いくつかのサンプルがあります。http://ormlite.com/docs/logging – Gray