簡體   English   中英

Android SQLite - 根據表 2 中的更改更新表 1

[英]Android SQLite - Update table 1 based on changes in table 2

我正在開發一個 android 應用程序,我有兩個 sqlite 表。

projects
id     projectname    projectstatus
1      TestProj1             1
2      TestProj2             1

outlets
id    pid    outletname    status
1      1      testoutlet1    1
2      1      testoutlet2    1
3      2      testoutlet1    1

在每個項目下,我可能有一個出口或多個出口 用戶應該在每個插座中執行某些操作。 只有狀態為 1 的項目和出口對用戶可見。

outlet 表中的pid 是指projects 表的id。 在用戶完成任務時的出口級別,我將狀態更新為 2。在將項目中的每個出口的狀態更新為 2 后,我試圖將項目的狀態更新為 2。

例如,前 2 個出口在 TestProj1 中,因為我們可以看到 pid 為 1。以下代碼將出口的狀態設置為 2。

private void updateOutletStatus() {
        String query = "select OutletName from projectparams where projectName= '"+projectName+"' and OutletName= '"+outletName+"' group by projStatus";
        if (sqLiteHelper.getData(query).getCount()==1) {
            Toast.makeText( getApplicationContext(), "No more tasks in this outlet!", Toast.LENGTH_SHORT ).show();
            SQLiteDatabase db = sqLiteHelper.getWritableDatabase();
            String outletUpdate = "update outlets set status=2 where OutletName='"+outletName+"' and pid = (select id from projects where projectName = '"+projectName+"' ) ";
            db.execSQL(outletUpdate);
        }
    }

上面的代碼工作正常。 當項目中所有插座的插座狀態變為 2 時,我想將 projectstatus 設置為 2。我嘗試了以下代碼:

private void updateProjectStatus() {
        String query = "select Status from outlets where pid = (select id from projects where ProjectName = '"+projectName+"' )  group by Status";
        if (sqLiteHelper.getData(query).getCount()==1) {
            Toast.makeText( getApplicationContext(), "No more outlets in this project!", Toast.LENGTH_SHORT ).show();
            SQLiteDatabase db = sqLiteHelper.getWritableDatabase();
            String projectUpdate = "update projects set projectStatus=2 where pid = (select id from projects where ProjectName = '"+projectName+"' ) ";
            db.execSQL(projectUpdate);
        }
    }

以上不適用於項目更新。 我嘗試了各種組合但仍然不起作用

也許考慮使用以下內容:-

private void updateProjectStatus() {
        db.execSQL("UPDATE projects SET projectstatus = 2 WHERE id IN (SELECT projects.id FROM projects JOIN outlets ON projects.id = outlets.pid WHERE projectstatus < 2 AND projectname ='" + projectName + "' GROUP BY pid HAVING (count() * 2) = sum(status))");
}
  • 請注意,如果您刪除了AND projectname ='" + projectName + "'那么它會更新所有尚未將狀態設置為 2 並且所有出口都設置為狀態 2 的項目(在這種情況下,將有沒有要綁定的值)。

通常認為最好不要通過串聯插入值,而是綁定通過execSQL的第二個參數傳遞的值。

  • 通過參數綁定值有很多優點
    • SQL 更短
    • 由於正確包含值,因此出錯的可能性較小
    • 它提供了針對 SQLInjection 的保護

然后上面的將變成(代表要綁定的值的?)

private void updateProjectStatus() {
        db.execSQL("UPDATE projects SET projectstatus = 2 WHERE id IN (SELECT projects.id FROM projects JOIN outlets ON projects.id = outlets.pid WHERE projectstatus < 2 AND projectname = ? GROUP BY pid HAVING (count() * 2) = sum(status))", new String[]{projectName});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM