【问题标题】:Put Sql Data to a Number Array将 Sql 数据放入数字数组
【发布时间】:2014-06-27 18:01:31
【问题描述】:

我有问题。如何将数据从 SQL 数据库放入 Number 数组。我想把它们放在一个图表中

我有一个NullPointerException 用于这些命令

Number[] series2Numbers={s1nInt[1]};

这是我的完整代码

openDB();
Cursor c = myDb.getSpalte();        

while (c.moveToPrevious())
{        
    s1nInt[i] = c.getInt(1);
    i++;
    c.moveToPrevious();

}
c.close();
closeDB();    

Number[] series2Numbers={s1nInt[1]};

这是我的例外:

Graph.onStart() line: 85    
Graph(Fragment).performStart() line: 1801   
FragmentManagerImpl.moveToState(Fragment, int, int, int, boolean) line: 937 
 FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1106 
 BackStackRecord.run() line: 690    
 FragmentManagerImpl.execPendingActions() line: 1571    
FragmentManagerImpl$1.run() line: 447   
Handler.handleCallback(Message) line: 733   
Handler.dispatchMessage(Message) line: 95   

我的 getSpalte()

public Cursor getSpalte(){
    String where= null;
    String Order = "_id DESC";
    Cursor c =  db.query(true, DATABASE_TABLE, KEY_KALOA, 
            where, null, null, null, Order, null);
  if (c != null) {
  c.moveToFirst();
}
  return c;
}

我需要这个数组:

 XYSeries series1 = new SimpleXYSeries(
                     Arrays.asList(series1Numbers),          // SimpleXYSeries takes a List so turn our array into a List
                     SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
                     "Series1");                             // Set the display title of the series

【问题讨论】:

  • 向我们展示您的数据库查询(getSpalte())。我猜 myDb 是你自己的类型,因为它有一个名为“getSpalte()”的方法。并且请包括查询表的结构。
  • 乍一看,s1nInt数组的大小似乎小于2。
  • @Michael:乍一看,您会发现这会产生ArrayIndexOutOfBoundsException 而不是NPE。但是,看起来结果只有 1 列。
  • @fabian 你是对的..对不起..

标签: java android sql arrays eclipse


【解决方案1】:

s1nInt 在行中是null

Number[] series2Numbers={s1nInt[1]};

也许您从未在某处初始化 s1nInt 或将其设置为 null。这是该行中唯一可以生成NullPointerException 的部分。

这也意味着c.moveToPrevious() 失败了。

来自Cursor.moveToPrevious()的api文档:

如果光标已经在结果集中的第一个条目之前,此方法将返回 false。

也许您也必须将moveToPrevious() 更改为moveToNext()。 (光标在查询后的第一个条目之前的位置)。

您还可以在每次循环迭代中移动光标两次。这样,您只会得到任一奇数行偶数行。


更新

在您对问题进行最新编辑后,您似乎需要 List<? extends Number> 而不是数组。由于列表的所有元素都是Integers,因此您应该使用ArrayList<Integer>。这样可以减少null 元素和列表的危险。您的代码可能如下所示:

public Cursor getSpalte(){
    String where= null;
    String Order = "_id DESC";
    Cursor c =  db.query(true, DATABASE_TABLE, KEY_KALOA, // hope KEY_KALOA is guarantied to be correct here
            where, null, null, null, Order, null);
    return c;
}

openDB();
Cursor c = myDb.getSpalte();
List<Integer> valueList = new ArrayList<Integer>(c.getCount());

while (c.moveToNext()) {        
    valueList.add(c.getInt(0)); // assuming the first column is of type INT
}
c.close();
closeDB();

XYSeries series1 = new SimpleXYSeries(
                 valueList,
                 SimpleXYSeries.ArrayFormat.Y_VALS_ONLY,
                 "Series1");

根据您的需要,有多种替代方法可以直接使用ArrayList

  • 如果您担心List 可能被修改,您可以使用Collections.unmodifiableList(List) 创建一个不支持修改的列表。
  • 如果您确实只需要列表中的 1 个元素,您可以使用 Cursor.moveToPosition(int)Collections.singletonList(Integer)

【讨论】:

  • 我得到了这些异常06-28 12:00:26.956: E/CursorWindow(5510): Failed to read row 1, column 1 from a CursorWindow which has 3 rows, 1 columns.
  • @user3779128:索引从零开始,这意味着第 1 列位于索引 0 而不是索引 1。(请参阅Cursor.getInt(int) API doc
  • 嗯,我怎么能改变他这样做?
  • @user3779128:我不确定我是否正确理解了该评论(“他”是谁?),但如果您想修复该错误,应将c.getInt(1) 更改为c.getInt(0)
  • 嗯。但我没有帮助
猜你喜欢
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多