【问题标题】:SQLite Android Inner joinSQLite Android 内连接
【发布时间】:2014-04-18 17:33:39
【问题描述】:

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

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。零是三星大。 对此有什么想法或建议吗?

【问题讨论】:

  • 尝试在没有加载程序的情况下执行您的查询,以表明这确实是 SQLite 问题,而不是您的加载程序的
  • @Drew 查询运行良好。我已经检查过了。
  • 在两台设备上都运行良好,结果相同吗?如果是这样,问题出在你的加载器上
  • @Drew 你能告诉我可能出了什么问题吗?
  • 如果你告诉我你是如何在你的活动/片段等中使用它的

标签: android android-sqlite


【解决方案1】:

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

这种问题很难解释,因为它很可能不会引发任何错误,而只会显示不同且不需要的结果。

你能做的就是“改进查询”

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

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 我已经更新了我的问题。看看你能不能理解它。
【解决方案2】:

在我看来,您的 WHERE 子句的最后一部分是不必要的:

 and R.area_id=2

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多