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

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

解决方法

因为我找不到合适的答案,这是我在尝试一段时间后解决它的方法:
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;
}

}

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

Android – 使用ORMLite DAO作为ContentProvider的更多相关文章

  1. 创建 Swift 自定义集合类

    在本文,你将学习用Swift的collection协议创建自定义集合类型。当文本结束,你会拥有一个强大的自定义集合类型,拥有Swift内置集合的所有功能。小于次的版本无法编译,因为Swift标准库发生了剧烈改变。在一个Set集合中,重复对象会被忽略。Swift提供了让Bag符合传统集合的所有工具。你需要先了解一下在Swift中,让一个对象变成集合需要做些什么。要理解什么是Swift集合,首先需要它继承的协议层次:Sequence协议表示类型支持排序、以迭代的方式访问其元素。

  2. swift – 使用依赖于元素类型的递归属性/方法扩展Collection

    –但调度已关闭:$1.flatCount不绑定到第二个递归版本,但总是绑定到第一个普通版本.也就是说,flatCount仅计算第一个嵌套级别.有没有办法以表达此功能的方式处理类型和/或调度?

  3. 数组 – Swift 2D数组通用扩展 – 访问第二维的问题

    我正在尝试将以下函数转换为2D数组的通用扩展.我特别难以指出如何指定约束以允许我访问第二个维度.这是一次失败的尝试:问题是编译器不知道你的扩展是用于2D数组–它只知道它是用于集合数组.因此,关联类型Indexdistance和Index不一定是Int.因此,解决方案是约束您的扩展,以便Element的Indexdistance和Index属于Int类型.这将允许您形成范围0..

  4. 带引号的ORMLite查询,Android

    我正在使用Ormlite,使用TableRecentSearch:它几乎一直在工作,但当我发现包含’的字符串的情况时,它似乎是一个问题.你知道怎么解决这个问题吗?我找不到我要找的东西.这是我删除最近的功能这是我得到的例外情况:解决方法在ORMLite中,当您尝试使用引号构建查询时,应该使用SelectArg功能,该功能将使用sql生成查询?

  5. android – MarkerView走出图表的最后一点

    我正在使用MarkerView类在图表中显示标记视图.我创建的markerview布局包含两个textview,一个在另一个之下.我面临的问题是图表上最后一个点的标记视图是图表中的一半,而图表中的一半.下面的两张图片清楚地说明了问题:第一张图显示了图表中心点的标记视图,显示没有任何问题:第二个图像,如下所示,显示图表最后一个点的标记视图,它是图表中的一半.如何调整此标记视图以使其在图表区域内显示.Wiki不会为markerview声明任何自定义.还有更多自定义吗?

  6. android – ORMLite – 查询外部字段

    使用OrmliteforAndroid,我需要构建一个按订单ID或客户名称返回订单的查询.请考虑以下类声明:我正在寻找的原始sql将是这样的:使用Ormlite执行此操作的最佳方法是什么?解决方法ORMLite现在支持simplejoinqueries.所以你的查询看起来像这样:

  7. android – 当app是后台FCM时,如何检索通知消息intent.getExtras()

    我正在使用FCM进行简单通知当应用程序处于前台时,一切正常.我在onMessageReceived方法中收到通知和数据消息.但是当应用程序处于后台时,我会在系统托盘中收到通知.当我点击控件时,它会转到主要活动.当我解析intent.getExtras();时,我只得到这个关键数据–google.sent_time,from,google.message_id,collapse_key.如何从intent.getExtras()获取系统托盘中可见的通知消息标题和消息?

  8. Android – 使用ORMLite DAO作为ContentProvider

    我旁边的同事真的非常想使用Ormlite,因为他不想自己编写任何映射.我知道atleap和Android-OrmliteContentProvider项目的存在.这些只为活动提供了一个光标,我的同事希望拥有模型列表或单个模型.这可以实现吗?和Contentprovider必须使用模型.但是,使用列表等仍然可以实现相同的功能吗?将事件传递给contentobservers等活动?

  9. 如何在Android中轻击叠加层显示弹出窗口?

    在我的地图应用程序中,我在地图上显示一组叠加层.每当我点击叠加层,我需要显示一个弹出窗口,像这样任何人可以帮我解决这个问题吗?解决方法是的,您可以通过点按地图设计我们的自助信息窗口来显示信息,如果您明白,请重播我,我将向您提供代码.在这段代码中,我设计了一个绘制信息窗口的函数

  10. 深入解读JavaScript中的Iterator和for-of循环

    这篇文章主要介绍了JavaScript中的Iterator和for-of循环,是JS入门学习中的基础知识,需要的朋友可以参考下

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部