【问题标题】:List size return 0 from sqlite query列表大小从 sqlite 查询返回 0
【发布时间】:2018-01-09 09:26:58
【问题描述】:

我尝试通过连接三个表来查询前提列表。但是,当我添加 WHERE 时,我的列表返回空。我试图记录所有内容..似乎没有它,我能够获得前提列表......但这是错误的。我尝试在 DB Browser for sqlite 上运行查询,它设法运行并返回正确的列表。请帮帮我。

这是我的查询代码..

public List<TXN_Premise> getTxnTableData(String tableName, String columnName) {

        ArrayList<TXN_Premise> itemList = new ArrayList<>();
        String selectQuery = "SELECT "
                + Constants.COLUMN_PREMISE_REF + ", "
                + Constants.COLUMN_PREMISE_NAME + ", "
                + Constants.COLUMN_PREMISE_ADDRESS + ", "
                + Constants.REF_PREMISE_CATEGORY_TABLE + "." + Constants.COLUMN_PREMISE_CATEGORY_ID + " AS " + Constants.COLUMN_FK_PREMISE_CATEGORY_ID +", "
                + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." + Constants.COLUMN_PREMISE_CATEGORY_MASTER_ID + " AS " + Constants.COLUMN_FK_PREMISE_CATEGORY_MASTER_ID + ", "
                + Constants.COLUMN_PREMISE_REG_NO + ", "
                + Constants.COLUMN_PREMISE_REG_DATE + ", "
                + Constants.REF_PREMISE_CATEGORY_TABLE + "." + Constants.COLUMN_DESCRIPTION + " AS premiseCategoryDescription, "
                + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." + Constants.COLUMN_DESCRIPTION + " AS premiseCategoryMasterDescription "

                + " FROM " + tableName

                + " LEFT JOIN " + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + " ON " +
                Constants.TXN_PREMISE_TABLE + "." + Constants.COLUMN_FK_PREMISE_CATEGORY_MASTER_ID + " = " + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." + Constants.COLUMN_CODE

                + " LEFT JOIN " + Constants.REF_PREMISE_CATEGORY_TABLE + " ON " +
                Constants.TXN_PREMISE_TABLE + "." + Constants.COLUMN_FK_PREMISE_CATEGORY_ID + " = " + Constants.REF_PREMISE_CATEGORY_TABLE + "." + Constants.COLUMN_CODE

//              + " WHERE " + Constants.REF_PREMISE_CATEGORY_TABLE + "." + Constants.COLUMN_LANG + " = 'MYS'"
//              + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." + Constants.COLUMN_LANG + " = 'MYS' AND "
//              + Constants.COLUMN_PREMISE_NAME + " <> '-' AND " + Constants.COLUMN_PREMISE_NAME + " <> '-TIADA-'"

                + " ORDER BY " + columnName + " ASC LIMIT 3";

        Log.d("test", "getTxnTableData: " + selectQuery);

        try {
            open();
            //make sure the database is not empty
            if (sqLiteDatabase != null) {
                //get a cursor for all state in the database
                Cursor cursor = sqLiteDatabase.rawQuery(selectQuery, null);

                Log.d("test", "getTxnTableData: cursor " + cursor.toString());

                Log.d("test", "getTxnTableData: outside");

                if (cursor.moveToFirst()) {
                    while (!cursor.isAfterLast()) {
                        TXN_Premise premiseColumn = new TXN_Premise();
//                      premiseColumn.setPremiseId(cursor.getString(0));
                        premiseColumn.setPremiseRef(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_REF)));
                        premiseColumn.setPremiseName(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_NAME)));
                        premiseColumn.setPremiseAddress(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_ADDRESS)));
                        premiseColumn.setFk_premiseCategoryId(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_FK_PREMISE_CATEGORY_ID)));
                        premiseColumn.setFk_premiseCategoryMasterId(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_FK_PREMISE_CATEGORY_MASTER_ID)));
                        premiseColumn.setPremiseRegNo(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_REG_NO)));
                        premiseColumn.setPremiseRegDate(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_REG_DATE)));


                        //  todo: temp premise category description
                        premiseColumn.setPremiseCategoryName(cursor.getString(cursor.getColumnIndex("premiseCategoryDescription")));
                        premiseColumn.setPremiseCategoryMasterName(cursor.getString(cursor.getColumnIndex("premiseCategoryMasterDescription")));

                        Log.d("test", "getTxnTableData: premiseName " + cursor.getString(cursor.getColumnIndex(Constants.COLUMN_PREMISE_NAME)));

                        //add premiseColumn in the cursor
                        itemList.add(premiseColumn);
                        cursor.moveToNext();
                    }
                }
                cursor.close();
            }
            close();

        } catch (SQLException e) {
            e.printStackTrace();
        }

        Log.d("test", "getTxnTableData: itemlist " + itemList.size() );

        return itemList;
    }

【问题讨论】:

  • 你是从光标处获取数据吗...
  • 不同的查询,或者不同的数据。
  • 我将光标数据传递给一个数组..

标签: android mysql sqlite android-cursor


【解决方案1】:

由于 WHERE 子句依赖于基础数据,因此无法重现问题并因此确定问题。

因此,您需要遵循简单的问题确定。

正如您指出的那样,它可以在没有 WHERE 子句的情况下工作

  • 1) 删除 WHERE 子句并运行。

    • 1a) 如果您现在检索行,然后逐个条件逐步构建 WHERE 子句,这将突出问题。

    • 1b) 如果删除 WHERE 子句后仍然没有行的问题,则从 String selectQuery = "SELECT * FROM " + tableName; 开始逐步构建整个 SQL,检查结果是否符合预期。

我会建议改变

    Log.d("test", "getTxnTableData: cursor " + cursor.toString());

    Log.d("test", "getTxnTableData: cursor " + cursor.getCount());

这将显示光标中的行数。

此外,您还可以利用the utillities here


编辑

仔细观察,WHERE 子句似乎存在一些问题:-

为简化起见,将在任何地方做出以下决议:-

  • Constants.REF_PREMISE_CATEGORY_TABLE 似乎将被替换为 rpc
  • Constants.REF_PREMISE_CATEGORY_MASTER_TABLE 似乎将替换为 mrpc

  • Constants.COLUMN_LANG 出现,将替换为lang

  • Constants.COLUMN_PREMISE_NAME 出现,会被替换为 name

所以:-

" WHERE " + Constants.REF_PREMISE_CATEGORY_TABLE + "." + Constants.COLUMN_LANG + " = 'MYS'"
              + Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." + Constants.COLUMN_LANG + " = 'MYS' AND "
              + Constants.COLUMN_PREMISE_NAME + " <> '-' AND " + Constants.COLUMN_PREMISE_NAME + " <> '-TIADA-'"

变为(????(n) 用于表示问题,其中 n 标识特定问题,注意它不是 SQL 的一部分):-

" WHERE rpc.lang = 'MYS' ????(1) mrpc.lang = 'MYS' AND name &lt;&gt; '-' AND name &lt;&gt; '-TIADA-' ????(2)

  • 问题 1 ????(1) 两次检查之间没有条件,例如也许应该是WHERE rpc.lang = 'MYS' AND mrpc.lang = 'MYS' .......

    • 这可能会产生类似于
    • 的错误
    • ..... [ near "?????????": syntax error ] Exception Name: NS_ERROR_FAILURE Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)
  • 问题 2 ????(2) 这对条件将 NEVER 满足 name 只能是 - 或 -TIADA- 从不同时。也许您的意思是 OR 在这种情况下,我会将它们括在括号中。

所以也许代码可能是:-

" WHERE " + 
    Constants.REF_PREMISE_CATEGORY_TABLE + "." + 
        Constants.COLUMN_LANG + 
        " = 'MYS'" + 
" AND " + 
    Constants.REF_PREMISE_CATEGORY_MASTER_TABLE + "." +
        Constants.COLUMN_LANG + " = 'MYS' " + 
" AND (" +
            Constants.COLUMN_PREMISE_NAME + " <> '-' " + 
            "  OR " + 
            Constants.COLUMN_PREMISE_NAME + " <> '-TIADA-'" + 
")"

【讨论】:

  • 当我删除 WHERE 子句时,我正在检索行......但即使我添加了 1 个条件......它也失败了......我尝试将其更改为另一个条件,但它仍然失败
  • @hibikiryou 请编辑您的问题并包含日志中的堆栈跟踪以显示您遇到的错误(如果有多个,则包括 WHERE 子句)。
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多