当我说Google IO演示时,我的意思是这个:https://www.youtube.com/watch?v=xHXn3Kg2IQE by Virgil Dobjanschi.
现在我一直在寻找一个实现,它向我展示了如何将ORMLite与Contentproviders结合使用.
现在我的问题是ORMLite DAO与Contentprovider冲突.他们基本上做同样的事情并且很难相互融合. (Using Ormlite in Conjunction with Android’s Content Provider其他人讨论此事并同意这项索赔.)
一些库已经将ORMLite实现到contentprovider API模式中,例如:https://github.com/blandware/android-atleap
然而,在水下他们仍然将模型还原为ContentValues(简单类型).
Android – Using Dao Pattern with contentProvider
这个问题与我的情况类似,但3年前,我建议在下面提出替代解决方案.
@ jcwenger的回答非常有用,但我想知道过去3年是否有任何改变.我面临同样的问题,也许现在因为ORMLite已经成熟,使用ORMLite更有意义吗?
我旁边的同事真的非常想使用ORMLite,因为他不想自己编写任何映射.我知道atleap和Android-OrmLiteContentProvider项目的存在.这些只为活动提供了一个光标,我的同事希望拥有模型列表或单个模型.这可以实现吗?
我的同事建议编写我自己的Cursor,SyncAdapter实现?和Contentprovider(必须完成)必须使用模型.但是,使用列表等仍然可以实现相同的功能吗?将事件传递给contentobservers等活动?
这可行吗?
编辑
我们很可能会私下使用内容提供商.我们不需要公开这些内容提供者.然而,内容提供商提供的优势很大.当数据发生变化时,我怎样才能通知我的GUI更新?
我还必须在一个活动中显示来自多个表(连接和其他数据,不包含在同一个表中)的数据并下载图像等.
解决方法
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[] arg3) { // TODO Auto-generated method stub return 0; } }