SELECT DISTINCT不适用于Android SQLite

时间:2016-11-21 00:42:19

标签: android sqlite android-sqlite

(注意问题已根据我目前的工作进行了更新) 我正在编写一个应用程序,其位置记录如下:

id(primary), state, region, area, latitude, longitude

我可以在屏幕上获取所有数据,但我只想列出状态,只列出状态而不是任何其他数据。每个唯一条目也只有一个条目。即新南威尔士州1新南威尔士州不是全部99个。然后,用户将选择他们所居住的所需状态,然后它将显示该状态的新数据表。 (按州我的意思是NSW,VIC,QLD等)

班级' Dataprovider和recyclerview类也可以正常工作,所以我会保留代码,除非有人想看到它。

这是有问题的数据库类。

public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "ReefData.db";
private static final int DATABASE_VERSION = 1;

public MyDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    setForcedUpgrade();

}

public Cursor getData(){
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"};
    String sqlTables = "Reefs";
    qb.setTables(sqlTables);
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);
    c.moveToFirst();
    return c;
}}

所以我的第一次尝试如下:

String [] sqlSelect = {"0 _id", "state=DISTINCT", "area", "region", "latitude", "longitude"};

但这只是给我一个错误。

所以我把它改回了orignal并按如下方式修改了查询:

String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"};
Cursor c = qb.query(db, sqlSelect, "state= 'TAS'", null, null, null, null);

现在这只适用于TAS数据。我甚至可以用

修改它
Cursor c = qb.query(db, sqlSelect, "state= 'TAS' and region='Flinders Island'", null, null, null, null);

并且效果很好。

但是,我怎样才能得到一个只有状态的列表,每个只有一个。我会考虑做以下事情,但它不起作用:

Cursor c = qb.query(db, sqlSelect, "state = DISTINCT", null, null, null, null);

有什么想法吗?

更新:所以我在附图中尝试了以下内容,因此我越来越接近解决方案,但并不完全在那里。仍然需要帮助来解决这个问题。

enter image description here

2 个答案:

答案 0 :(得分:0)

此行中有一个错误的0

String [] sqlSelect = {"0 _id", "state", "area", "region", "latitude", "longitude"};`
                        ^here

我怀疑你不打算选择文字值,所以你应该删除它:

String [] sqlSelect = {"_id", "state", "area", "region", "latitude", "longitude"};`

如果你 打算选择文字值,那么你需要用逗号分隔它:

String [] sqlSelect = {"0", "_id", "state", "area", "region", "latitude", "longitude"};`
                          ^here

答案 1 :(得分:0)

<强>解决!

返回游标的SQLiteQueryBuilder方法不允许直接使用 Boolean 参数。

然而,在阅读课堂笔记后,我注意到方法 setDistinct 并将其应用于SQLiteQueryBuilder。

现在它起作用了,每个州只给我一个独特的条目,就像我想要做的那样。我确实需要删除其他列并只关注状态,但那是与此问题无关的另一个问题/解决方案。我只想说我必须只关注列状态并将 setDistinct 应用于该列,以获得所需的结果。

继承完成的代码:

public Cursor getData(){
    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
    String [] sqlSelect = {"0 _id", "state"};
    String sqlTables = "Reefs";
    qb.setTables(sqlTables);
    qb.setDistinct(true);
    Cursor c = qb.query(db, sqlSelect, null, null, null, null, null);
    c.moveToFirst();
    return c;
}