在SQLiteQueryBuilder setTables中连接表

时间:2013-08-08 16:21:17

标签: android sqlite

现在我有以下代码:

    SQLiteDatabase db=getReadableDatabase();
    SQLiteQueryBuilder qb=new SQLiteQueryBuilder();

    String[] sqlSelect={"0 _id","lang","value"};
    String sqlTables="gloss";

    qb.setTables(sqlTables);

    Cursor c=db.query(GL_TABLE, sqlSelect, "value like '%"+inputText+"%'", null, null, null, null, "20");

工作完美。这里的代码只占用一个表。如何从3个相互关联的表中获取数据(条目是主要节点,感觉是条目的孩子,光泽是感觉的孩子):

  

条目(ID,ent_seq);感(ID,FK);光泽(ID,FK,郎,值);

是否可以使用setTables执行此操作?如果是,请提供一些建议。

我已经完成了@ Anders8说:

public Cursor getJoinedInfo(String lookingFor)
{
    Log.d(LOG_TAG, "DB: looking up info");

    SQLiteDatabase db=getReadableDatabase();

    Cursor cursor;
    String query;

    query="SELECT " +
            " e.id," +
            " s.id," +
            " s.fk," +
            " g.id," +
            " g.fk," +
            " g.lang," +
            " g.lang" +
            " FROM entry e" +
            "     INNER JOIN sense s ON e.id = s.fk" +
            "     INNER JOIN gloss g ON s.id = g.fk" +
            " WHERE g.value like '%"+lookingFor+"%'";

    Log.d(LOG_TAG, "DB: query = \n" + query.replace(", ",",\n  "));
    cursor=db.rawQuery(query,null);
    Log.d(LOG_TAG, "DB: query complete");

    return cursor;      
}

它给出了这个错误:

  

08-09 22:26:16.632:E / AndroidRuntime(9842):java.lang.IllegalArgumentException:列'_id'不存在

我该怎么办?

2 个答案:

答案 0 :(得分:3)

这将是这样的:

public Cursor getJoinedInfo(String lookingFor)
{
    Log.d(TAG, "DB: looking up info");

    Cursor cursor;
    String query;

    query="SELECT " +
            " a.fieldName1," +
            " a.fieldName2," +
            " b.fieldName3," +
            " c.fieldName4" +
            " FROM tableName1 a" +
            "     INNER JOIN tableName2 b ON a.someKeyInA = b.someKeyInB" +
            "     INNER JOIN tableName3 c ON a.someOtherKeyInA = c.someKeyInC" +
            " WHERE a.FieldName ='" + lookingFor +"'";
    Log.d(TAG, "DB: query = \n" + query.replace(", ",",\n  "));
    cursor=db.rawQuery(query,null);
    Log.d(TAG, "DB: query complete");

    return cursor;      
}

显然,构建您需要的查询。 ;)

答案 1 :(得分:-1)

你可以perform a join in SQLite。这将允许您将您正在使用的表中的所有或仅某些属性加入到最终关系中。这样你就可以精确地选择你想要的东西。

我不知道数据集中有什么或者你在寻找什么,所以我不能写查询但是我会说 - 你最好的方法是(1)将查询写成字符串(2)执行使用该字符串的原始数据库查询和(3)使用游标从结果中选择数据。