SQLite Android 内连接

4

我有一个奇怪的问题。我正在从服务器中获取数据并将其插入表格中。插入后,我使用两个表之间的内部连接查询数据。 下面是我的查询:

Select 
    F._id, F.id, F.logo, F.total_like, F.distance, F.store_name, F.mob_no_1,
    F.mob_no_2, F.mob_no_3, F.tel_no_1, F.tel_no_2, F.tel_no_3, F.description,
    R.total_record, R.total_page, R.current_page 
from 
    FAVOURITE_STORES as F 
    INNER JOIN FAVOURITE_RECORDS as R on F.area_id = R.area_id 
where 
    F.area_id = 2 and 
    R.area_id = 2

在某些设备上,我的光标计数为1,在另一些设备上,光标计数为零。即使表中有数据也是如此。

以下是我的选择查询函数:

public Cursor rawQuery(String sQuery,String[] selectionArgs) {
        if(mDatabase == null) {
            mDatabase = getWritableDatabase();
        }
        debug("Query "+sQuery);
        return mDatabase.rawQuery(sQuery,selectionArgs);
    }

光标类

public class ExampleCursorLoader extends CursorLoader {
    private Activity mActivity;
    private String msQuery;
    private DBUtil mDbUtil;
    private String[] mSelectionArgs;

    public ExampleCursorLoader(Activity context, String query,String[] selectionArgs) {
        super(context);
        this.mActivity = context;
        this.msQuery = query;
        this.mSelectionArgs = selectionArgs;
        this.mDbUtil = DBUtil.getInstance(mActivity.getApplicationContext());
    }

    public ExampleCursorLoader(Activity context, String query) {
        this(context,query,null);
        debug(query);
    }
    public Cursor loadInBackground() {  
        debug("Loading in Background");
        Cursor cursor=null;
        cursor = mDbUtil.rawQuery(msQuery,mSelectionArgs);
        return cursor;
    }

    private void debug(String s) {
        Log.v("Adapter " , "Adapter " + s);
    }

    protected void onStartLoading() {
        forceLoad();
        debug("Started Loading");
    }

    protected void onStopLoading() {
        super.onStopLoading();
    }


}

这就是我如何调用它。

return new ExampleCursorLoader(mActivity,sQuery);

将计数设为1的设备是三星s3,而计数为零的设备是三星Grand。对此有什么想法或建议吗?


尝试执行查询而不使用加载器来指示它确实是SQLite问题,而不是您的加载器的问题。 - Drew
@Drew 的查询运行得非常好。我已经检查过了。 - Manoj
它在两个设备上都正常运行并给出相同的结果吗?如果是这样,那么问题就出在你的加载器上。 - Drew
@Drew,你能告诉我可能出了什么问题吗? - Manoj
如果您能向我展示如何在您的Activity/Fragment等中使用它 - Drew
2个回答

1

计数为1的设备是三星S3,而计数为零的是三星Grand。对此有什么想法或建议吗?

这种问题很难解释,因为大多数情况下不会出现任何错误,但只会显示不同和不需要的结果。

您能做的就是“改进查询”:

首先使用占位符而不是原始语句:

String query = "... where F.area_id = ? and R.area_id = ?";
String[] whereArgs = {"2", "2"};

此外,您不需要使用 AS 子句,只需说:
... from FAVOURITE_STORES F INNER JOIN FAVOURITE_RECORDS R on ...

从您提供的代码来看,一切都似乎是正确的(查询和使用rawQuery()方法)。


@Ragnar,我更新了我的问题。看看你能否理解它。 - Manoj

0

我觉得你 WHERE 子句的最后一部分是不必要的:

 and R.area_id=2

您已经指定了 FAVOURITE_STORES 表的行以匹配 area_id=2。由于 INNER JOIN 是在该列上执行的,它只会返回 FAVOURITE_RECORDS 中与 FAVOURITE_STORES 的 area_id 列匹配的行。

我不确定 SQLite 引擎如何处理这个问题,但值得一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接