首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android -使用ORMLite DAO作为ContentProvider

Android -使用ORMLite DAO作为ContentProvider
EN

Stack Overflow用户
提问于 2014-05-30 09:26:00
回答 1查看 3.5K关注 0票数 7

我在Google演示文稿中看到了模式C,我非常渴望实现这个模式。但是,我确实非常喜欢ORMLite库,并且希望在我的应用程序中也使用这个库。

当我说Google演示文稿时,我指的是这个: Virgil的https://www.youtube.com/watch?v=xHXn3Kg2IQE

现在,我一直在寻找一个实现,它向我展示了如何与Contentproviders一起使用ORMLite。

现在我的问题是,ORMLite DAO与Contentprovider冲突。他们本质上也是这样做的,他们是一个痛苦的融入彼此。(Using Ormlite in Conjunction with Android's Content Provider其他人讨论这个问题,并同意这一说法。)

一些库已经将ORMLite实现到内容提供者API模式中,其中一个例子是:https://github.com/blandware/android-atleap

然而,在水下,他们仍然将模型恢复为ContentValues (简单类型)。

Android - Using Dao Pattern with contentProvider这个问题类似于我的情况,但3年前,我建议了下面的另一个解决方案。

@jcwenger的答案非常有用,但我想知道在过去的三年中是否有任何变化。我也面临着同样的问题,也许现在ORMLite已经成熟了,使用ORMLite会更有回报吗?

我旁边的同事真的非常非常想使用ORMLite,因为他不想自己写任何映射。我知道atleap和项目的存在。这些只为活动提供一个游标,我的同事希望有模型或单个模型的列表。能否做到这一点?

我的同事建议编写我自己的游标实现,SyncAdapter?而Contentprovider (不管怎么做)都要与模型一起工作。然而,同样的功能还能通过列表等实现吗?将事件传递给活动内容、观察者等?

这可行吗?

编辑我们很可能会私下使用内容提供者。我们不需要公开这些内容提供者。然而,内容提供者提供的优势是巨大的。否则,当数据发生变化时,我如何通知GUI更新?

我还必须在一个活动中显示多个表(联接和其他数据,不包含在同一个表中)中的数据,并下载图像等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-21 14:39:37

所以,既然我找不到合适的答案,经过一段时间的努力,我就解决了这个问题:

代码语言:javascript
复制
public class CardProvider extends ContentProvider {

private InternalDatabase dbhelper;
private RuntimeExceptionDao<Card, UUID> cardDao;

/**
 * Content authority for this provider.
 */
private static final String AUTHORITY = CardUris.CONTENT_AUTHORITY;

// The constants below represent individual URI routes, as IDs. Every URI pattern recognized by
// this ContentProvider is defined using sUriMatcher.addURI(), and associated with one of these
// IDs.
//
// When a incoming URI is run through sUriMatcher, it will be tested against the defined
// URI patterns, and the corresponding route ID will be returned.
/**
 * URI ID for route: /cards
 */
public static final int ROUTE_CARDS = 1;

/**
 * URI ID for route: /cards/{ID}
 */
public static final int ROUTE_CARDS_ID = 2;

/**
 * UriMatcher, used to decode incoming URIs.
 */
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
    sUriMatcher.addURI(AUTHORITY, "cards", ROUTE_CARDS);
    sUriMatcher.addURI(AUTHORITY, "cards/*", ROUTE_CARDS_ID);
}

@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public String getType(Uri uri) {
    final int match = sUriMatcher.match(uri);
    switch (match) {
        case ROUTE_CARDS:
            return CardUris.CONTENT_CARDS;
        case ROUTE_CARDS_ID:
            return CardUris.CONTENT_ITEM_CARD;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }
}

@Override
public Uri insert(Uri arg0, ContentValues arg1) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public boolean onCreate() {
    dbhelper = OpenHelperManager.getHelper(getContext(), InternalDatabase.class);
    cardDao = dbhelper.getRuntimeExceptionDao(Card.class);
    return true;
}

@Override
public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,
        String arg4) {

    int uriMatch = sUriMatcher.match(uri);
    switch (uriMatch) {
        case ROUTE_CARDS_ID:
            /*String id = uri.getLastPathSegment();
            Card card = null;
            try {
                card = cardDao.queryBuilder().where().eq(Entry.ID_FIELD_NAME, id).queryForFirst();
            } catch (SQLException e) {
                e.printStackTrace();
            }*/
            //return null;
        case ROUTE_CARDS:
            // Return all known entries.
            // Note: Notification URI must be manually set here for loaders to correctly
            // register ContentObservers.
            // build your query
            QueryBuilder<Card, UUID> qb = cardDao.queryBuilder();

            // when you are done, prepare your query and build an iterator
            CloseableIterator<Card> iterator = null;
            Cursor cursor = null;
            try {
                //qb.query();
                iterator = cardDao.iterator(qb.where().eq("relevant", 1).and().eq("removed", false).prepare());
               // get the raw results which can be cast under Android
               AndroidDatabaseResults results =
                   (AndroidDatabaseResults)iterator.getRawResults();
               cursor = results.getRawCursor();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
               //iterator.closeQuietly();
            }
            cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
            return cursor;
        default:
            throw new UnsupportedOperationException("Unknown uri: " + uri);
    }

}

@Override
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
    // TODO Auto-generated method stub
    return 0;
}

}

您可能会使用insert、update和delete方法,但dao也是这样做的,这就是我正在使用的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23951176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档