我正在寫一個支持SQLite 3的小型Android應用程序。自動櫃員機我正在實施一些數據庫函數,並問自己,如果最好有一個大的加入查詢,或者如果可以在應用程序性能方面使用多個查詢。Android SQLite 3,JOINS或多個查詢?
比方說,我有一個3表「驅動程序」,「driven_runs」,「race_disciplines」。每個driven_run都有一個驅動程序和一個race_discipline。假設我想在某個學科中獲得某個駕駛員的所有種族學科。
溶液1
我已經與返回駕駛員對象和功能getRaceDiscipline(disciplineID)與回報一種族學科編碼的函數getDriver(driverID)。所以,我只想創建在這種情況下功能
public ArrayList<DrivenRun> getDrivenRunsOnDiscipline(short driverID, short disciplineID) {
ArrayList<DrivenRun> drivenRuns = new ArrayList<DrivenRun>();
String sql = "SELECT * FROM " + DBHelper.TABLE_DRIVEN_RUNS + " WHERE "
+ DBHelper.DRIVEN_RUNS_COLUMN_DRIVER_ID + "=" + driverID + " AND "
+ DBHelper.DRIVEN_RUNS_COLUMN_RACE_DISCIPLINE_ID + "=" + disciplineID + ";";
Cursor result = rawQuery(sql);
if (result.moveToFirst()) {
do {
Driver driver = getDriver(driverID);
RaceDiscipline discipline = getRaceDiscipline(disciplineID);
DrivenRun run = new DrivenRun();
run.setDriver(driver);
run.setDiscipline(discipline);
run.setResult("WHATEVER");
drivenRuns.add(run);
} while(result.moveToNext());
}
return drivenRuns;
}
會有層出不窮,但編碼執行3個查詢是要簡單得多。
解決方案2
我想創建一個大的連接查詢像
String sql = "SELECT * FROM driven_runs CROSS JOIN drivers CROSS_JOIN race_disciplines WHERE driven_runs.driver_id=drivers.id AND driven_runs.race_discipline_id=race_disciplines.id"
Cursor result = rawQuery(sql);
和將手動創建驅動程序和DrivenRun對象。
這種解決方案需要更多的寫作,但只執行一個查詢(或不數據庫執行3個查詢以及加入3個表什麼時候?)
長話短說,是OK去與解決方案1,因爲在關於表現沒有太大區別?