从数据库中检索下一个数据?

时间:2017-02-01 11:41:10

标签: android sql database

好的,我只是按照一条指令,我应该这样做从数据库中检索sql数据,但它只是切到那里,到目前为止我在databasehelper类中有这个。

 public void getIconResource(String tblName)
     {
         SQLiteDatabase db = this.getReadableDatabase();

          String getresource = "Select * from " + tblName;

          Cursor cursor = db.rawQuery(getresource,null); //null for conditions

         if(cursor.moveToFirst())
         {
             do
             {
                 int resource = cursor.getInt(3);
             }
             while (cursor.moveToNext());
         }
         db.close();
     }

所以不知何故,这样做是否得到了我的表第4列的所有值,其中包含一个int ...如何检索MainActivity中的值并将其保存在整数数组中?

3 个答案:

答案 0 :(得分:0)

好吧,就像你拥有它一样,变量resource仅限于while循环。即使它不会在每次循环迭代中不断被覆盖。

相反,您应该在Add循环期间向其中声明一个更高的集合并while每个值。如果是整数,您还可以重新定义函数以返回集合。

public List<int> getIconResource(String tblName)
{
    SQLiteDatabase db = this.getReadableDatabase();
    List<int> myVals = new List<int>();

    String getresource = "Select * from " + tblName;

    Cursor cursor = db.rawQuery(getresource, null); //null for conditions

    if (cursor.moveToFirst())
    {
        do
        {
            myVals.Add(cursor.getInt(3));
        }
        while (cursor.moveToNext());
    }
    db.close();
    return myVals;
}

另外,作为注释... SQL查询的字符串连接是一个灾难的处方。查找SQL注入和最佳实践,以便在继续之前避免它。值得花时间在早期养成良好的习惯。

编辑/附录

除非您还限制从表查询返回的结果集,否则您将获得每条记录。你在这里的功能确实没有实际用途,可能会产生比它可能带来的任何好处更多的问题。我建议,作为更有用的函数的示例,它基于IconResource返回特定的IconId

public int getIconResource(int iconId)
{
    SQLiteDatabase db = this.getReadableDatabase();
    String getresource = "select IconResource from IconTable where IconId = ?";
    PreparedStatement pstmnt = db.prepareStatement(getresource);
    pstrmnt.setString(1, iconId);
    ResultSet rset = db.executeQuery();

    int iconResource;

    if (rset.next())
        iconResource = rset.getInt("IconResource");

    db.close();
    return iconResource;
}

当然,以上是对表结构的假设。

使用上面的代码,在其他地方的代码中,您只需使用IconId调用此函数并使用所需的输出:

int iconResource = getIconResource(5); // returns the IconResource for IconId = 5

上面通过使用参数化查询并避免使用发送到SQL服务器的动态连接字符串来防止任何可能的SQL注入攻击。

答案 1 :(得分:0)

您可以尝试以下代码:

public List<Integer> getIconResource(String tblName)
     {
         List<Integer> list =  new ArrayList<Integer>();
         list.clear();
         SQLiteDatabase db = this.getReadableDatabase();

          String getresource = "Select * from " + tblName;

          Cursor cursor = db.rawQuery(getresource,null); //null for conditions

         if(cursor.moveToFirst())
         {
             do
             {
                 int resource = cursor.getInt(3);
                 list.add(resource);
             }
             while (cursor.moveToNext());
         }
         db.close();
         return list;
     }

然后在MainActivity中调用此方法并将List存储在另一个Integer类型列表中。

databasehelper dbhelper; 
List<Integer> newList = dbhelper.getIconResource("Your tablename");
   fot(int i = 0 ; i< newList.size() ; i++){
    int yourValue = newList(i);
    }

答案 2 :(得分:0)

只需在ArrayList中添加所有内容并返回arraylist
只需在主要活动中调用该方法

即可
public ArrayList<Integer> getIconResource(String tblName)
 {
     SQLiteDatabase db = this.getReadableDatabase();

      String getresource = "Select * from " + tblName;

      Cursor cursor = db.rawQuery(getresource,null); //null for conditions

ArrayList data = new ArrayList&lt;&gt;();

     if(cursor.moveToFirst())
     {
         do
         {
             int resource = cursor.getInt(3);
            data.add(resource);
         }
         while (cursor.moveToNext());
     }
     db.close();
 }

返回数据; }