0

我试图让用户选择一个值,然后在我的数据库中搜索该值,并从包含该值的所有行返回信息。

我尝试了以下操作,但我不确定如何将结果正确返回给用户要查看的其他活动。

Cursor c = ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + " = '" + favoriteWorkoutName + "'", null);

我也试过这个,其中 int 行指定我想在查询时从中获取数据的 KEY_ROW。例如,用户输入最喜欢的锻炼的名称,然后在数据库中搜索包含该名称的所有行,然后返回 KEY_ROWS 1、2 和 3(对应于锻炼、代表等)。但是,这只从一行返回一个行值。

int row = 1;

    Cursor c = ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + " = '" + favoriteWorkoutName + "'", null);

    do{c.moveToNext();
    String data = c.getString(row);
    return data;
    }while (row <= 3); 

有什么建议么?

* *编辑:

我的活动中已经有类似的东西了。这就是我所拥有的。但是,我收到一个错误,它要求我“将 listCursor 的类型更改为 Cursor”,它已经是......或者“将 'GetFavoriteData' 的返回类型更改为 Cursor”,这也已经是。

此外,当我确实没有错误时,我不确定如何使用返回的数据并将其插入到我的 TextView 中。它不允许我设置文本(listCursor)。

理想情况下,我需要从每个返回的行中获取信息作为单独的字符串,以便我可以在 TextViews 中以我需要的方式显示它们。

在我的活动中:

String favoriteWorkoutName = cfdName.getText().toString();

                ExerciseDatabase choosefavorite = new ExerciseDatabase(WorkMeOutActivity.this);
                try {
                    choosefavorite.open();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Cursor listCursor = choosefavorite.GetFavoriteData(favoriteWorkoutName);    


                choosefavorite.close();

在我的 DBHelper 类中:

public Cursor GetFavoriteData(String favoriteWorkoutName){

    return ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + " = '" + favoriteWorkoutName + "'", null);


}
4

2 回答 2

0

你的问题不清楚...

如果您尝试在所有不同的列中搜索该值,您的查询应该看起来更像这样:

Cursor c = ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + 
    " LIKE '" + favoriteWorkoutName + "' OR " + COLUMN2 + " LIKE '" + favoriteWorkoutName + 
    "' OR " + COLUMN3 + " LIKE '" + favoriteWorkoutName + "'", null);

这将搜索 KEY_FAVNAME、COLUMN2 和 COLUMN3 列,并返回包含 favoriteWorkoutName 内容的任何行。

如果您只想要特定列中的那些,那么您首先发布的内容是正确的。

编辑

重新阅读后,我对您的问题有了不同的了解。

您应该在要使用它的活动中调用光标。正常的方法是定义一个 DB 帮助类来创建 db 并包含与其相关的所有功能(添加、删除、更新信息、获取游标等)。然后你实例化那个类并使用它的方法来处理数据库。

一个例子是(在您想要访问数据的活动中使用):

mDbHelper = new WorkoutDB(getActivity());  // instantiate your dbhelper class
mDbHelper.open();                          // use the dbhelper open method to open the db
Cursor listCursor = mDbHelper.fetchFavoriteWorkout(favoriteWorkoutName);  // use the fetchFavoriteWorkout method to get your cursor

您的 dbhelper 类将包含一个方法(以及许多其他方法),如下所示:

public Cursor fetchFavoriteWorkout(String favoriteWorkoutName){
    return ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + " = '" +  favoriteWorkoutName + "'", null);                 
}
于 2012-06-05T12:26:53.470 回答
0

我认为您误解了getString()方法。看一看:

public abstract String getString (int columnIndex)
Since: API Level 1

将请求列的值作为字符串返回。

The result and whether this method throws an exception when the column value is null or the column type is not a string type is implementation-defined.
Parameters
columnIndex     the zero-based index of the target column.
Returns

    the value of that column as a String. 

因此,如果您使用 c.getString(row) 在内部传递 1,2 或 3,它只会为您提供来自特定行的一列(索引为 1,2 或 3)的值。


c.getString(c.getColumnIndex(column_name))如果您不确定列的索引并希望从其名称中获取它,则可以使用。


现在我想你想从前几行匹配的行(比如 3 行)中检索一些列的值(比如一行的前 3 列值),如果是这样使用它们:

Cursor c = ourDatabase.rawQuery("SELECT * FROM FavoriteTable WHERE " + KEY_FAVNAME + " = '" + favoriteWorkoutName + "'", null);

String fcv="";
String scv="";
String tcv="";


if(c.getCount() == 0)
                    {
                     //no data found
                    }
                    else  {
                        int i=0;
                      c.moveToFirst();
                        do {


                              fcv  = fcv + c.getString(0)); //or use  fcv  = fcv + c.getString(c.getColumnIndex(name of first column)));
                              scv  = fcv + c.getString(1)); 
                              tcv  = fcv + c.getString(2));   
                              i++;
                          } while (c.moveToNext() && i<3);              

                  c.close();

根据需要使用字符串的值:)

于 2012-06-05T15:50:14.153 回答