首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQLite嵌套查询转换为解析查询

将SQLite嵌套查询转换为解析查询
EN

Stack Overflow用户
提问于 2014-07-11 03:37:38
回答 2查看 201关注 0票数 0

为游标取以下where子句:

代码语言:javascript
复制
whereClause = DBHelper.SCHEDULE_DAY + " = '" + dayOfTheWeek + "' AND "
                      + DBHelper.SCHEDULE_STARTTIME + " = (SELECT " + DBHelper.SCHEDULE_STARTTIME
                      + " FROM " + DBHelper.TABLE_SCHEDULE + " WHERE " + DBHelper.SCHEDULE_DAY
                      + " = '" + dayOfTheWeek + "' AND " + DBHelper.SCHEDULE_STARTTIME + " < "
                      + (currenttime - 100)  + " ORDER BY "
                      + DBHelper.SCHEDULE_STARTTIME + " DESC LIMIT 1)";

用SQL语法编写的是:

从进度表中选择className,其中day =“星期二”,startTime =(从日程中选择startTime,其中日期=“星期二”,startTime < 1200顺序,按startTime DESC限制1);

它是否可能存在于嵌套参数的解析查询中?使用LocalData存储功能,我希望删除SQLite数据库以支持LocalDatastore,因为我已经将它用于临时缓存。也许我考虑过了从SQLite到Parse的翻译,但这是我到目前为止想出的:

代码语言:javascript
复制
ParseQuery<ParseObject> query = ParseQuery.getQuery("classes");
    query.whereEqualTo("day", dayOfTheWeek);
    // What to add in here for time?
    query.fromLocalDatastore();
    query.findInBackground(new FindCallback<ParseObject>() {
    public void done(List<ParseObject> classList, ParseException e) {
        if (e == null) {
           //Do something with results
        } else {
           // Failed
        }
    }
});

类会持续一个小时,因此是当前的时间-100 (如果是早上8点,请查找从0700或之前(0800-100)开始的类。答案是否为复合解析查询,如以下所示:

代码语言:javascript
复制
ParseQuery<ParseObject> startHour = ParseQuery.getQuery("classes");
startHour.whereEqualTo("day", dayOfTheWeek);
query.whereLessThan("startHour", currenttime -100);
query.addDescendingOrder("startHour");
query.setLimit(1);

List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
queries.add(startHour);

ParseQuery<ParseObject> mainQuery = ParseQuery.or(queries);
mainQuery.whereEqualTo("day", dayOfTheWeek);
mainQuery.findInBackground(new FindCallback<ParseObject>() {
  public void done(List<ParseObject> results, ParseException e) {
    // result is the classes that start at or before the hour found
  }
});

非常感谢StackOverflow上的社区为他们提供的所有帮助!

更新:

我设法用两个parseQueries来解决这个问题:

代码语言:javascript
复制
ParseQuery<ParseObject> startHour = ParseQuery.getQuery("schedule");
    startHour.whereEqualTo("day", "Thursday");
    startHour.whereLessThan("startHour", (currenttime - 100) / 100 * 100);
    startHour.orderByDescending("startHour");
    startHour.fromPin("schedule");
    startHour.setLimit(1);
    startHour.fromLocalDatastore();
    startHour.findInBackground(new FindCallback<ParseObject>() {
      public void done(List<ParseObject> results, ParseException e) {
        // result is the classes that start at or before the hour found
        for (ParseObject object : results) {
          time = object.getInt("startHour");
        }

        // Toast.makeText(Dialog_Checkin.this, "time query: " +
        // String.valueOf(time),
        // Toast.LENGTH_LONG).show();
      }
    });

    ParseQuery<ParseObject> mainQuery = ParseQuery.getQuery("schedule");

    mainQuery.whereEqualTo("day", "Thursday");
    mainQuery.fromPin("schedule");
    mainQuery.whereGreaterThan("startHour", time - 5);
    mainQuery.whereLessThan("startHour", time + 5);
    // mainQuery.whereEqualTo("startHour", 1930);
    mainQuery.fromLocalDatastore();
    mainQuery.findInBackground(new FindCallback<ParseObject>() {
      public void done(List<ParseObject> results, ParseException e) {
        // result is the classes that start at or before the hour found
        if (e == null) {
          Toast.makeText(Dialog_Checkin.this, "array values: " + String.valueOf(results.size()),
                          Toast.LENGTH_LONG).show();
          for (ParseObject object : results) {
            Toast.makeText(Dialog_Checkin.this, "array values: " + object.getString("class"),
                            Toast.LENGTH_LONG).show();
          }
        } else {
          Toast.makeText(Dialog_Checkin.this, e.getMessage(), Toast.LENGTH_LONG).show();
        }

        // Toast.makeText(Dialog_Checkin.this, "array values: " +
        // String.valueOf(results.size()),
        // Toast.LENGTH_LONG).show();
      }
    });

然而,我似乎发现了一个问题。如果我在第二个查询中添加了一个约束

mainQuery.whereEqualTo("startHour",时间);

它返回0的结果。如果我更改了添加以下两个约束,它就能工作:

代码语言:javascript
复制
mainQuery.whereGreaterThan("startHour", time-5);
mainQuery.whereLessThan("startHour", time+5);

那么,为什么如果我做GT和LT,它可以工作,但不等于?我已经将它作为一个bug发布在解析的站点上,下面是我的数据库程序的屏幕截图,其中显示了我希望返回的两个条目:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-18 05:15:10

这是一个有效的错误,已经用facebook https://developers.facebook.com/bugs/335038033327436/解决了。

票数 0
EN

Stack Overflow用户

发布于 2014-07-12 06:25:25

所以我找出了部分问题,尽管仍然有一个bug。运行两个"findInBackground“操作似乎存在时间问题,第二个查询在第一个操作期间或之前实际运行。这一点很明显,当我试图祝酒“时间-5",我会得到一个弹出式表示"-5",而不是一个4位数的时间,表明时间变量尚未从第一个查询设置。

最后,我将第一个查询更改为常规查询(ParseQuery.find()),从而解决了这个问题。这始终为我提供了第二个查询所需的时间值。

使用"whereEqualTo“似乎仍然存在不止一次的问题,因此我不得不使用GreaterThan和LessThan子句来解决这个问题。下面是我想要的代码

代码语言:javascript
复制
ParseQuery<ParseObject> startHour = ParseQuery.getQuery("schedule");
    startHour.whereEqualTo("day", dayOfTheWeek);
    startHour.whereLessThan("startHour", (currenttime - 100));
    startHour.orderByDescending("startHour");
    startHour.fromPin("schedule");
    startHour.setLimit(1);
    startHour.fromLocalDatastore();
    startHour.clearCachedResult();
    List<ParseObject> results;
    try {
      results = startHour.find();
      ParseObject result = results.get(0);
      Toast.makeText(Dialog_Checkin.this, String.valueOf(result.getInt("startHour")),
                      Toast.LENGTH_LONG).show();
      timeT = result.getInt("startHour");
    } catch (ParseException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }

    ParseQuery<ParseObject> mainQuery = ParseQuery.getQuery("schedule");

    mainQuery.whereEqualTo("day", dayOfTheWeek);
    mainQuery.fromPin("schedule");

    mainQuery.whereGreaterThan("startHour", timeT - 5);

    mainQuery.whereLessThan("startHour", timeT + 5);
    // mainQuery.whereEqualTo("startHour", timeT); //This doesn't work...duhh
    mainQuery.fromLocalDatastore();
    mainQuery.findInBackground(new FindCallback<ParseObject>() {
      public void done(List<ParseObject> results, ParseException e) {
        // result is the classes that start at or before the hour found
        if (e == null) {

          for (ParseObject object : results) {
            Toast.makeText(Dialog_Checkin.this, "array values: " + object.getString("class"),
                            Toast.LENGTH_LONG).show();
          }
        } else {
          Toast.makeText(Dialog_Checkin.this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
      }
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24689712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档