Android:使用光标从数据库设置 Spinner 的选定项目

发布于 2024-11-28 17:49:45 字数 2163 浏览 0 评论 0原文

我的游标有问题。 我的数据库中有 3 个表:facture(指发票)、vehicule(车辆)和车库。

一张发票涉及一辆车和一个车库。创建发票时,我从旋转器中选择车辆和车库。

当我想要更新发票时,我需要设置在这些微调器中选择的项目。

我是这样做的:

    for (int iVhc = 0; iVhc < spListeVhc.getCount(); iVhc++) {
        Cursor valueVhc = (Cursor) spListeVhc.getItemAtPosition(iVhc);
        long idVhc = facture.getLong(facture.getColumnIndexOrThrow("TB_VEHICULE._id"));
        long idSpVhc = valueVhc.getLong(valueVhc.getColumnIndex("TB_VEHICULE._id"));

        if (idSpVhc == idVhc) {
            spListeVhc.setSelection(iVhc);
        }
    }


    for (int iGar = 0; iGar < spListeGar.getCount(); iGar++) {
        Cursor valueGar = (Cursor) spListeGar.getItemAtPosition(iGar);
        long idGar = facture.getLong(facture.getColumnIndexOrThrow("TB_GARAGE._id"));
        long idSpGar = valueGar.getLong(valueGar.getColumnIndex("TB_GARAGE._id"));

        if (idSpGar == idGar) {
            spListeGar.setSelection(iGar);
        }
    }   

它适用于车库,但问题是,由于我不明白的原因,车辆的旋转器采用与车库相同的 ID。

这意味着,如果所选车库在数据库中的 ID 为 2,则所选车辆也将是 ID 为 2 的车辆。

??

这是我获取发票的查询:

public Cursor recupFacture(long idFacture){
    return db.rawQuery("SELECT TB_FACTURE._id, libelle_fa,  date_fa, nom_vhc, kilometrage_fa, nom_garage, remarque_fa, date_paie_fa,  montant_fa, TB_VEHICULE._id, TB_GARAGE._id" +
                        " FROM TB_FACTURE, TB_VEHICULE, TB_GARAGE" +
                        " WHERE fk_vhc_fa = TB_VEHICULE._id" +
                        " AND fk_gar_fa = TB_GARAGE._id" +
                        " AND TB_FACTURE._id ="+idFacture, null);
}

我意识到我的日志中存在此类错误:

08-10 12:54:22.431: ERROR/Cursor(17072): requesting column name with table name -- TB_VEHICULE._id

车库也是如此......

感谢您的帮助!

编辑:

我找到了解决方案。

我将 TB_GARAGE._id 和 TB_VEHICULE._id 替换为以下行中的 fk:

long idVhc = facture.getLong(facture.getColumnIndexOrThrow("TB_VEHICULE._id"));
long idGar = facture.getLong(facture.getColumnIndexOrThrow("TB_GARAGE._id"));

但是,我无法真正解释为什么它会这样工作但不能使用 ID。 表的前缀导致了一个奇怪的错误......

I have a problem with Cursors.
I have 3 tables in my DB : facture (means invoice), vehicule (vehicle) and garage.

An invoice concerns one vehicle and one garage. When I create an invoice, I select the vehicle and the garage from spinners.

When I want to update an invoice, I need to set the item selected in these spinners.

Here is how I do :

    for (int iVhc = 0; iVhc < spListeVhc.getCount(); iVhc++) {
        Cursor valueVhc = (Cursor) spListeVhc.getItemAtPosition(iVhc);
        long idVhc = facture.getLong(facture.getColumnIndexOrThrow("TB_VEHICULE._id"));
        long idSpVhc = valueVhc.getLong(valueVhc.getColumnIndex("TB_VEHICULE._id"));

        if (idSpVhc == idVhc) {
            spListeVhc.setSelection(iVhc);
        }
    }


    for (int iGar = 0; iGar < spListeGar.getCount(); iGar++) {
        Cursor valueGar = (Cursor) spListeGar.getItemAtPosition(iGar);
        long idGar = facture.getLong(facture.getColumnIndexOrThrow("TB_GARAGE._id"));
        long idSpGar = valueGar.getLong(valueGar.getColumnIndex("TB_GARAGE._id"));

        if (idSpGar == idGar) {
            spListeGar.setSelection(iGar);
        }
    }   

It works for the garage, but the problem is that, for a reason that I don't understand, the spinner of vehicles takes the same ID than the garage.

That means, if the garage selected has the ID 2 in the DB, the selected vehicle will be the vehicle with ID 2 too.

??

Here is my query to get the invoice:

public Cursor recupFacture(long idFacture){
    return db.rawQuery("SELECT TB_FACTURE._id, libelle_fa,  date_fa, nom_vhc, kilometrage_fa, nom_garage, remarque_fa, date_paie_fa,  montant_fa, TB_VEHICULE._id, TB_GARAGE._id" +
                        " FROM TB_FACTURE, TB_VEHICULE, TB_GARAGE" +
                        " WHERE fk_vhc_fa = TB_VEHICULE._id" +
                        " AND fk_gar_fa = TB_GARAGE._id" +
                        " AND TB_FACTURE._id ="+idFacture, null);
}

And I realised that I have thi kind of mistakes in my log :

08-10 12:54:22.431: ERROR/Cursor(17072): requesting column name with table name -- TB_VEHICULE._id

And same for garage...

Thanks for your help!

EDIT :

I found a solution.

I replaced the TB_GARAGE._id and TB_VEHICULE._id by the fk at the lines :

long idVhc = facture.getLong(facture.getColumnIndexOrThrow("TB_VEHICULE._id"));
long idGar = facture.getLong(facture.getColumnIndexOrThrow("TB_GARAGE._id"));

However, I can't really explain why it works like this but not with the ID.
The prefix of the table causes a strange mistake...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贩梦商人 2024-12-05 17:49:45

您是否正确保存发票?确保您不会意外地将车库 ID 也保存为车辆 ID。

否则,“骨折”如何定义?也许那里有一个错误。

Are you saving the invoice correctly? Make sure you are not accidentally saving the garage ID as vehicle ID as well.

Otherwise, how is "fracture" defined? Perhaps there is a mistake there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文