Android – 使用ORMLite DAO作为ContentProvider

前端之家收集整理的这篇文章主要介绍了Android – 使用ORMLite DAO作为ContentProvider前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Google IO演示文稿中看到了模式C,我非常渴望实现这种模式.但是,我确实喜欢ORMLite库,并希望在我的应用程序中使用此库.

当我说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更新?

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

@H_404_29@解决方法
因为我找不到合适的答案,这是我在尝试一段时间后解决它的方法
  1. public class CardProvider extends ContentProvider {
  2.  
  3. private InternalDatabase dbhelper;
  4. private RuntimeExceptionDao<Card,UUID> cardDao;
  5.  
  6. /**
  7. * Content authority for this provider.
  8. */
  9. private static final String AUTHORITY = CardUris.CONTENT_AUTHORITY;
  10.  
  11. // The constants below represent individual URI routes,as IDs. Every URI pattern recognized by
  12. // this ContentProvider is defined using sUriMatcher.addURI(),and associated with one of these
  13. // IDs.
  14. //
  15. // When a incoming URI is run through sUriMatcher,it will be tested against the defined
  16. // URI patterns,and the corresponding route ID will be returned.
  17. /**
  18. * URI ID for route: /cards
  19. */
  20. public static final int ROUTE_CARDS = 1;
  21.  
  22. /**
  23. * URI ID for route: /cards/{ID}
  24. */
  25. public static final int ROUTE_CARDS_ID = 2;
  26.  
  27. /**
  28. * UriMatcher,used to decode incoming URIs.
  29. */
  30. private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  31. static {
  32. sUriMatcher.addURI(AUTHORITY,"cards",ROUTE_CARDS);
  33. sUriMatcher.addURI(AUTHORITY,"cards/*",ROUTE_CARDS_ID);
  34. }
  35.  
  36. @Override
  37. public int delete(Uri arg0,String arg1,String[] arg2) {
  38. // TODO Auto-generated method stub
  39. return 0;
  40. }
  41.  
  42. @Override
  43. public String getType(Uri uri) {
  44. final int match = sUriMatcher.match(uri);
  45. switch (match) {
  46. case ROUTE_CARDS:
  47. return CardUris.CONTENT_CARDS;
  48. case ROUTE_CARDS_ID:
  49. return CardUris.CONTENT_ITEM_CARD;
  50. default:
  51. throw new UnsupportedOperationException("Unknown uri: " + uri);
  52. }
  53. }
  54.  
  55. @Override
  56. public Uri insert(Uri arg0,ContentValues arg1) {
  57. // TODO Auto-generated method stub
  58. return null;
  59. }
  60.  
  61. @Override
  62. public boolean onCreate() {
  63. dbhelper = OpenHelperManager.getHelper(getContext(),InternalDatabase.class);
  64. cardDao = dbhelper.getRuntimeExceptionDao(Card.class);
  65. return true;
  66. }
  67.  
  68. @Override
  69. public Cursor query(Uri uri,String[] arg1,String arg2,String[] arg3,String arg4) {
  70.  
  71. int uriMatch = sUriMatcher.match(uri);
  72. switch (uriMatch) {
  73. case ROUTE_CARDS_ID:
  74. /*String id = uri.getLastPathSegment();
  75. Card card = null;
  76. try {
  77. card = cardDao.queryBuilder().where().eq(Entry.ID_FIELD_NAME,id).queryForFirst();
  78. } catch (sqlException e) {
  79. e.printStackTrace();
  80. }*/
  81. //return null;
  82. case ROUTE_CARDS:
  83. // Return all known entries.
  84. // Note: Notification URI must be manually set here for loaders to correctly
  85. // register ContentObservers.
  86. // build your query
  87. QueryBuilder<Card,UUID> qb = cardDao.queryBuilder();
  88.  
  89. // when you are done,prepare your query and build an iterator
  90. CloseableIterator<Card> iterator = null;
  91. Cursor cursor = null;
  92. try {
  93. //qb.query();
  94. iterator = cardDao.iterator(qb.where().eq("relevant",1).and().eq("removed",false).prepare());
  95. // get the raw results which can be cast under Android
  96. AndroidDatabaseResults results =
  97. (AndroidDatabaseResults)iterator.getRawResults();
  98. cursor = results.getRawCursor();
  99. } catch (sqlException e) {
  100. e.printStackTrace();
  101. } finally {
  102. //iterator.closeQuietly();
  103. }
  104. cursor.setNotificationUri(this.getContext().getContentResolver(),uri);
  105. return cursor;
  106. default:
  107. throw new UnsupportedOperationException("Unknown uri: " + uri);
  108. }
  109.  
  110. }
  111.  
  112. @Override
  113. public int update(Uri arg0,ContentValues arg1,String[] arg3) {
  114. // TODO Auto-generated method stub
  115. return 0;
  116. }
  117.  
  118. }

你可以给插入,更新和删除方法的目的,但dao也这样做,是我正在使用的.

猜你在找的Android相关文章