草庐IT

Android ContentProvider 与 ORMLite

coder 2023-11-22 原文

我正在使用内容提供程序来管理我的应用程序数据,这些数据不会与其他应用程序共享。但是,有一些样板代码,例如将光标转换为域对象。 ORMLite 提供了一种更优雅的方式,将数据库条目直接映射到域对象。所以我想用 ORMlite 替换内容提供者。但是我有些担心:

  1. 内容提供者在多线程环境中运行良好。我不知道 ORMlite 是否是线程安全的。
  2. 内容提供者可以广播数据库变化。不知道ORMLite有没有这种支持。
  3. Android 提供一些实用程序,例如 AsynQueryHandler、CursorLoader 来执行异步查询数据库。如果我使用 ORMLite,我必须明确地创建一个线程或 AsyncTask 来执行查询。

我是否应该用 ORMLite 替换内容提供者?

最佳答案

我不认为,您可以将 ORM 与 Content Provider 进行比较。 ORMLite 提供以下功能 link给用户,并在开发时有完整的独立目标。

但除了您提到的内容之外,还有内容提供商的其他一些好处。

  1. 如果您想在多个应用程序或进程之间共享日期。可能现在您没有任何计划这样做,但似乎您的应用程序对数据库的负担很重,并且将来如果您计划与第三方或您的其他应用程序共享您的数据,您可以选择与内容提供商。

  2. 内容提供程序是所有 Android 版本的标准配置,这也意味着您的应用使用它是安全的。我很确定 ORMLite 也很稳定。但是你真的想冒这个风险吗,特别是如果那不能节省你的时间或者你没有任何业务要​​求这样做。 Android API 已经支离 splinter ,您是否想在此基础上承担其他工作负载?

  3. 如果您想将数据上传到云端,很容易与 SyncAdapter 集成

  4. 使用 android 安全和权限功能。

关于处理 Content Provider 所需的额外代码,您是对的。

现在我正在做一个项目,我们有大约 20 个表。我为每个表创建了一个 DAO。它基本上在内部使用内容提供者。

DAO->Content Provider->SQL Lite Open Helper

Class XyzDao{
    private final Context mContext;
    XyzDao(Context context){
        this.mContext=context;
    }
    public String getMyData(){
        //content provider code
        return myData;
    }
    public void setMyData(String x, int y, double z){
        //content provider code to set the data
    }
}

如果没有 Content Provider 我本可以完成,现在根据当前要求可以正常工作,但我仍然选择这条路线。你可能会问为什么?

  • 异步操作
  • 与平台/云轻松集成。
  • 更少的代码,更少的错误,更少的戏剧性(想想我是否必须实现我们刚刚讨论的那些任务)

而且,最好的部分是从任何 Activity 中我可以简单地使用我的 DAO 来访问数据库。

或者您可以直接访问SQLLiteOpenHelper从你的 DAO。

归根结底,每个选择都取决于您的业务需求。如果您有很多持久性对象,ORMLite 可能是一个不错的选择。

关于Android ContentProvider 与 ORMLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779097/

有关Android ContentProvider 与 ORMLite的更多相关文章

  1. c# - ServiceStack OrmLite Sql 查询日志记录 - 2

    根据ServiceStackOrmlitedocumentation.我应该在Debug模式下生成sql查询。但是,我无法看到这些查询。简单代码privatestaticreadonlystringDataDirLoc=Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)+"\\TargetIntegration\\Test\\Debug\\";privatereadonlystringdbFileName=DataDirLoc+"Test.db3";[Test]publicvoidCan_Genera

  2. c# - SQL Server 特定类型支持 OrmLite - 2

    我刚刚了解了一种天才类型,它可以简化我的很多工作,但我喜欢的ORM似乎无法识别它。是否有解决方法让ServiceStackOrmLite识别SQLServer中的HierarchyId?关于修改哪些文件的任何建议以及如何进行的任何提示?编辑:这是对问题的更好说明。我有以下类(class):publicclassMyClass{publicintId{get;set;}publicSqlHierarchyIdHierarchyId{get;set;}}SqlHierarchyId是自定义SQLServer数据类型。OrmLite将为其生成以下类:有趣的是,我可以在属性上使用[String

  3. java - ORMLite - 如何创建对象并填充外部集合? - 2

    我正在尝试创建一个对象并在单个操作中填充该对象持有的外部集合的成员。我已经尝试了我能想到的每一种操作顺序,但似乎无法让它发挥作用。我的类(class)是(跳过不相关的字段和注释):@DatabaseTablepublicclassScheduledJob{@DatabaseField(id=true)privateStringid=UUID.randomUUID().toString();@ForeignCollectionField(eager=true)privateCollectiontasks;/*otherstuffhere...*/}@DatabaseTablepublic

  4. java - 如何在 OrmLite 中获取表名 - 2

    在OrmLite中,表的名称要么是它所基于的类的名称,要么是在@DatabaseTable(tableName="...")中定义的任何内容。注释该类。有没有方便的方法在运行时获取表名?在我的例子中,升级数据库时我需要所有表的名称以基于这些表重新创建数据库触发器。我已经查过了http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/table/TableInfo.html但我不明白ID应该是什么。 最佳答案 您可以使用extractTableNameDatabaseTableC

  5. android - 更新外部对象 ORMLite - ANDROID - 2

    我想知道如何更新ORMLITE中的外来对象?假设我有这些类(class)这是父级publicstaticclassParent{@DatabaseField(generatedId=true,allowGeneratedIdInsert=true)intid;@DatabaseFieldStringname;...这是childpublicstaticclassChild{@DatabaseField(generatedId=true,allowGeneratedIdInsert=true)intid;@DatabaseField(canBeNull=false,foreign=tru

  6. android - Android Studio 中的 Ormlite 多个 dex - 2

    我刚刚添加了Ormlite在我的android项目上,出现以下错误:Error:Executionfailedfortask':AgCelence:dexDebug'.>com.android.ide.common.internal.LoggedErrorException:Failedtoruncommand:/my/home/path/apps/Android/sdk/build-tools/19.0.3/dx--dex--output/my/home/path/workspace/my/project/path/build/dex/debug/my/home/path/works

  7. android - 如何使用 ormLite 将新字段添加到 android 中的现有实体中? - 2

    OLDENTITY:我有一个实体,但我忘记在某些字段上添加@DatabaseField注释@DatabaseTablepublicclassCard{@DatabaseField(generatedId=true)privateintid;@DatabaseField(unique=true)privateStringcardNumber;@DatabaseFieldprivateStringnameOnCard;privateStringccv;privateStringvalidFrom;privateStringvalidTill;privateStringpin;//Requi

  8. java - ORMLite 外国集合 : Must use ClosableIterator? - 2

    关于使用ORMLite的快速问题。我试图确保我的实现是正确的。文档的一部分讨论了closableIterators以及访问它如何加载LazyForeignCollection类,并且需要关闭(或读到最后)才能关闭数据库连接:NOTE:LikewiththeDao.iterator()method,theiteratorreturnedbyalazycollectionmustbeclosedwhenyouaredonewithitbecausethereisaconnectionopentothedatabaseunderneath.Aclosehappenseitherifyougo

  9. android - 在 ormlite android 中使用 DataType.SERIALIZABLE 存储对象列表 - 2

    如何在android中使用ORMlite保存一个ArrayList我的模型如下classModel{@DatabaseFieldpublicStringtype="";@DatabaseFieldpublicStringname="";@DatabaseFieldpublicDatedateTime=null;@DatabaseFieldArrayListitems=null;}并且Item类有classItem{@DatabaseFieldStringitemName;...}我收到以下异常:java.sql.SQLException:ORMLitecan'tstoreunknown

  10. java - Android SDK r18 似乎破坏了 ORMLite - 2

    我正在使用ormlitev4.35,我只需要在eclipse中将我的android工具更新到r18,因为在我升级工具之前,IDE不会构建我的项目。升级后,以下行会引发错误:mDbHelper=OpenHelperManager.getHelper(this,DatabaseHelper.class);异常是NoClassDefFoundError我去了ormlite网站,看到有一个更新的版本(4.40)下载并用更新的版本替换了引用,不幸的是,这并没有解决问题。有没有人遇到这个问题并解决了它? 最佳答案 Theexceptionisa

随机推荐