【问题标题】:Skip deleted/empty rows sqlite跳过已删除/空行 sqlite
【发布时间】:2013-01-17 21:44:25
【问题描述】:

我正在从 sqlite 数据库中填充 AChartEngine,我需要显示所有数据。我遇到的问题是,当我删除一条记录时,图表系列会停止填充已删除的记录。我需要找到一种方法来跳过已删除/空记录并继续填充我的图表。我需要它以与 listview 跳过已删除记录并继续显示所有行的方式相同的方式执行此操作。我对很多事情都很陌生,并且对此感到非常困难。我试图编写 if 语句以跳过已删除/空行,但似乎没有任何效果。感谢您的帮助!

在我的绘图活动中:

    for (int i = 1; !c.isAfterLast(); i++)  {

         String value1 = db.getValue1(i);
         String value2 = db.getValue2(i);

         c.moveToNext();

         double x7 = Double.parseDouble(value1);
         double y7 = Double.parseDouble(value2);

         myseries.add(x7, y7);  

         }

我收到错误:CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0

如果我用 try and catch 包围它,它将填充行直到被删除的记录。

“编辑” 在我的 sqlite 数据库中:

  public String getValue1(long l) {
    String[] columns = new String[]{ EMP_DEPT };
    Cursor c = db.query(EMP_TABLE, columns, EMP_ID + "=" + l, null, null, null, null);
    if (c != null){
    c.moveToFirst();
    String value1 = c.getString(0);


        return value1;


    }
    return null;
    }






public String getValue2(long l) {
    String[] columns = new String[]{ EMP_DATE1 };
    Cursor c = db.query(EMP_TABLE, columns, EMP_ID + "=" + l, null, null, null, null);
    if (c != null){
    c.moveToFirst();
    String value2 = c.getString(0);


        return value2;


    }
    return null;
    }

【问题讨论】:

  • 这确实表明如果删除数据库中的任何内容会影响您的图表,那么您的设置存在根本性错误。本质上,您应该将您的图表系列从查询加载到数据库,并且该图表系列全权负责为您的图表提供数据。在创建后影响数据库不应影响图形系列,从而影响图形。
  • 图表本身不是问题...我遇到的问题在于查询以及我如何填充系列。我认为我需要的是查询中的一条语句来跳过空行。查看更新后的帖子,我已包含我的查询。
  • 我的观点是,填充步骤和删除步骤应该是不同的步骤,这样如果操作正确,一个永远不会与另一个发生冲突。

标签: android sqlite for-loop achartengine


【解决方案1】:

您的问题是,对于不存在的行上的命令,您的安全网是使用 if (c != null){,然后在该块内执行您的命令,但是来自查询的 Cursor 请求永远不会出现null,而是会产生一个没有行的游标对象。

一个更合适的解决方案来使用它作为你的安全网而不是if (c.moveToFirst()){ 因为如果该方法实际上首先执行了它,该方法本身返回一个boolean - 如果它移动了truefalse如果不是(当没有可移动的行时会发生这种情况)。如果您愿意,另一种检查是查看光标有多少行 c.getCount()

此外,您应该组合您的方法,以免对数据库进行冗余查询:

public String[] getValues(long l) {
    String[] results = new String[2]; 
    String[] columns = new String[]{ EMP_DEPT, EMP_DATE1 };
    Cursor c = db.query(EMP_TABLE, columns, EMP_ID + "=" + l, null, null, null, null);
    if (c.moveToFirst()) {
        results[0] = c.getString(0);
        results[1] = c.getString(1);
    } else {
        Log.d("GET_VALUES", "No results formed from this query!");
    }
    return results;
}

【讨论】:

  • 感谢您对此事的帮助。我一定要结合这些方法。我用一个简单的 try catch 语句让它工作,但你的 aproch 似乎更好。会告诉你它是否有效。
【解决方案2】:

您应该使用单个查询一次获取所有值:

SELECT Date1 FROM MyTable WHERE id BETWEEN 1 AND 12345

或:

db.query(EMP_TABLE, columns, EMP_ID + " BETWEEN 1 AND " + ..., ...);

然后,当您遍历光标时,缺失值将不会显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 2021-05-30
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多