【问题标题】:Android SQLite - Update table 1 based on changes in table 2Android SQLite - 根据表 2 中的更改更新表 1
【发布时间】:2019-12-20 10:19:52
【问题描述】:

我正在开发一个 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 个 outlet 在 TestProj1 中,我们可以看到 pid 为 1。以下代码将 outlet 的状态设置为 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);
        }
    }

以上内容不适用于项目更新。我尝试了各种组合,但仍然不起作用

【问题讨论】:

  • 不工作是什么意思?表没有更新?你有错误吗?

标签: android sqlite sql-update


【解决方案1】:

也许考虑使用以下内容:-

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});
}

【讨论】:

  • 优秀!!!开箱即用......谢谢......这真的很有帮助......我有很多其他类似的更新,可以将其用作模板。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多