加入android表和自己的表

时间:2014-03-09 08:51:21

标签: android sql join android-contentprovider contacts

我有一些表格:

在android中:

Contacts (ContactsContract (android database)): ContactsId, DisplayName, Thumbnail Uri

Phone (android database): ContactsId, Number, Number_Type

在我的应用程序中:

MyMessageTable (my app database): Number, myMessageId, etc

现在我需要一行如下:

Number, Number_Type, DisplayName , Thumbnail Uri, myMessageId , etc

我希望在游戏加载器中使用行来显示在UI中。 但问题是我无法使用安卓表加入我的表。

解决方案:

  1. 分别查询每个表并在上层处理它(问题:无法将多个游标发送到游标加载器并在UI中使用它)

  2. 加入Android表和电话表后,用MyMessageTable加入结果(问题:在两个不同的数据库中加入两个不同的表?)

  3. 在RAM中缓存联系人和电话表并在上层处理它并仅将MyMessageTable光标发送到UI。 (问题:Ram的使用,需要时间在ram中缓存android表)

  4. 将Android表格复制到我的应用中的新表格并加入SQLiteQueryBuilder并使用ContentObserver更新我的表格。(问题:需要时间复制而且ContentObserver不起作用申请结束时。)

  5. 5.使用CursorJoiner。但我无法将多个cursor推送到UI

    你有更好的主意吗?

1 个答案:

答案 0 :(得分:0)

像这样创建一些游标包装器(它是一个穷人的实现,但显示了如何做到):

class CW extends CursorWrapper {
    public CW(Cursor cursor) {
        super(cursor);
    }

    // TODO you will probably need to override these methods:
    // public int getColumnCount()
    // public int getColumnIndex(String columnName)
    // public int getColumnIndexOrThrow(String columnName)
    // public String getColumnName(int columnIndex)
    // public String[] getColumnNames()

    @Override
    public String getString(int columnIndex) {
        if (columnIndex < super.getColumnCount()) {
            return super.getString(columnIndex);
        }
        return "extra column for row #" + getPosition();
    }
}

并测试它:

    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] proj = {
            ContactsContract.Contacts.DISPLAY_NAME
    };
    ContentResolver cr = getContentResolver();
    Cursor c0 = cr.query(uri, proj, null, null, null);
    while (c0.moveToNext()) {
        Log.d(TAG, "onCreate [" + c0.getString(0) + "]");
    }
    c0.close();

    Cursor c1 = new CW(cr.query(uri, proj, null, null, null));
    while (c1.moveToNext()) {
        Log.d(TAG, "onCreate [" + c1.getString(0) + "] [" + c1.getString(1) + "]");
    }
    c1.close();