이미지 처리 앱이 있습니다. 내 앱은 이미 처리 된 이미지를 데이터베이스에 저장합니다. 사용자가 앱을 열 때마다 앱은 데이터베이스에서 이미 처리 된 사진을 확인하기 시작합니다. 내 코드를 사용하면이 프로세스는 약 10-20 초가 걸리며 내 요구에 많은 시간이 걸립니다. 데이터베이스에는 이미지의 경로 인 하나의 열만 있습니다. 전화에서 전체 이미지 목록을 가져온 다음 데이터베이스에서 목록의 모든 항목을 검색합니다.
내 코드는 다음과 같습니다.
public static ArrayList<String> getAlreadyProcessedPhotos(Context context, ArrayList<String> photos, SQLiteDatabase db)
{
ArrayList<String> notAlreadyProcessedPhotos = new ArrayList<>();
for(String path : photos)
{
File imgFile = new File(path);
if (!Utils.isAlreadyProcessed(context, imgFile, db))
{
notAlreadyProcessedPhotos.add(path);
}
}
return notAlreadyProcessedPhotos;
}
public static boolean isAlreadyProcessed(Context context, File imgFile, SQLiteDatabase photosDb) {
if(photosDb == null || !photosDb.isOpen())
photosDb = new DatabaseHelper(context).getReadableDatabase();
String searchQuery = "SELECT * FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.PATH_COLUMN + "=?";
Cursor cursor = photosDb.rawQuery(searchQuery, new String[] {imgFile.getAbsolutePath()});
boolean result = cursor.moveToFirst();
cursor.close();
return result;
}
확인하려는 각 파일에 대해 별도의 sqlite 쿼리를 실행하고 있습니다. 느린 것은 당연합니다! 100 개의 파일이있는 경우 100 개의 쿼리를 수행해야합니다. 그러나 이것은 하나의 간단한 쿼리로 실제로 수행 할 수 있습니다. 두 가지 방법을 하나로 결합하면됩니다.
public static ArrayList<String> getAlreadyProcessedPhotos(Context context, ArrayList<String> photos, SQLiteDatabase db)
{
ArrayList<String> notAlreadyProcessedPhotos = new ArrayList<>();
ArrayList<String> preProc = new ArrayList()
for (String item: photos) {
preProc.add("'" + item + "'");
}
String inClause = TextUtils.join(",", preProc);
String searchQuery = "SELECT " + DatabaseHelper.PATH_COLUMN + "FROM " + DatabaseHelper.TABLE_NAME + " WHERE " + DatabaseHelper.PATH_COLUMN + "NOT IN (" +inClause + ")";
Cursor cursor = photosDb.rawQuery(searchQuery);
while(cursor.moveToNext())
{
notAlreadyProcessedPhotos.add(cursor.getString(0);
}
return notAlreadyProcessedPhotos;
}
이것은 하나의 루프, 하나의 쿼리입니다. 사진 배열 목록이 어디에서 왔는지 모르겠지만 추가 최적화의 여지가 있다는 느낌이 듭니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다