我在我的Android项目中使用Greendao作为ORM库,并且有问题了解交易的行为. Greendao提供API runInTx(Runnable r). 我的问题是,将如何处理此方法的两个调用? 线程1 public void thread1() { DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable() { doQueries(); doInsertsAndUpdates(); } } 线程2 public void thread2() { DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable() { doQueries(); doInsertsAndUpdates(); } } 我已经看到,runInTx在独家
以下是关于 greendao 的编程技术问答
我正在使用 greendao 来存储大量数据,来自 REST服务. 我的许多实体都与关系有关. 一切都很好,但是明天我必须实施一个岩石工作流程. 加载数据时,我必须检查是否发生错误. 如果是这样,我必须确保没有存储在sqlite db中. 通常,我会使用交易和回滚在例外, 否则对DB. 目前,我只使用insertordelete保存实体,每次我创建一个对象时. 实施的方法是什么? 解决方案 在插入和更新时,Greendao检查是否存在持续的事务.如果是这种情况,Greendao将不会开始新的交易. 因此,唯一要做的就是在完成工作后在数据库上启动交易,并在完成工作后提交/回滚.所有插入和更新都将处于相同的交易中,因为Greendao将对每个插入和更新操作都开始使用Commit/Rollback开始新的交易. 总结您可以使用这样的代码: SQLiteDatabase db = dao.getDatabase(); db.beginTra
我正在 greendao ,到目前为止,情况还不错.文档或网站(或任何地方:()似乎没有涵盖的一件事是处理线程安全的方式. 我知道其他地方提到的基础知识,例如"使用单个DAO会话"(Android + SQLite的一般实践),并且我非常了解Java内存模型.图书馆内部内容甚至显示出螺纹保护,或者至少以这种意图构建.但是我所看到的没有什么涵盖的内容: greendao caches实体默认.这对于完全单线程的程序非常好 - 透明和大多数用途的巨大性能提升.但是,如果我例如loadAll()然后修改其中一个元素,我在我的应用程序上修改了相同的对象 .如果我在主线程(例如显示)上使用它,并在背景线程上更新DB(正确且正确),除非采取额外的注意,否则存在明显的线程问题. Greendao是否在"引擎盖下"做任何事情以防止常见的应用程序级穿线问题?例如,在将UI线程保存在背景线程中时,修改UI线程中的缓存实体(更好的希望它们不会交织!尤其是在修改列表时!)?除了一般线程安全问题
我在sqlite中有一个查询: select * from table where upper(name) = "ABC"; Greendao中是否有一个功能可以执行相同的查询? 解决方案 您可以这样使用. 例如: SELECT * FROM prices WHERE flow LIKE "Tiroirs" SELECT * FROM prices WHERE flow LIKE "TirOirS" SELECT * FROM prices WHERE flow LIKE "tiroirS" 上面的三个示例在sqlite中具有相同的结果(MySQL,我也不知道所有DBS是否具有相同的行为).然后,您可以将等效物用于Greendao: priceDao.queryBuilder().where(PricesDBDao.Properties.Flow.like(flow)) 其他解决方案 尝试像此RAW查询 Query query = userD
使用绿色DAO时,需要一些代码自定义来从一个架构更新到另一个架构.对于我较早的需求,在Daomaster.java中使用此类代码添加任何新表是足够的: if(oldVersion==SCHEMA_VERSION_OLD_VERSION&& newVersion==SCHEMA_VERSION){ Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by adding language & checklist table"); boolean ifNotExists = true; NewTableDao.createTable(db, ifNotExists); NewTable2Dao.createTable(db,
在我的应用中,从活动1到4开始有4 Activities. Database创建发生在活动1中,并且在活动2,活动3等中更新了值,但是当我使用finish()从活动3到活动2移回活动时,它不会显示更新的值,因为.(无法显示更新的值) 我尝试了daosession.clear(),但没有清除数据. 因此,如何使用GreenDAO. 清除旧缓存并重新加载数据 在所有这些活动中,我使用了单独的会话.请参阅示例代码 假设当前活动是CaptureLocationDetails class public static CaptureLocationDetails getInstance() { return instance; } openHelper = new DevOpenHelper(MyApplication.getInstances()); //openHelper.openDatabase(); db = openHel
我有两个表A和B,我想使用Greendao编写以下查询. select a.*, b.* from A a, B b where a.a_id=b.a_id; 我到目前为止取得了成就: Adao.queryRawCreate(" , B b where T.a_id=b.a_id"); ,但这只能从A中返回.我需要A和B的列. 如何使用Greendao? 实现这一目标? 解决方案 Greendao还不支持加入. 即使是:Greendao是ORM框架.这意味着它将您的表行映射到对象.使用ORM-FRAMEWORK,您通常会使用Tomany和Toone关系从对象到对象,并且您不要求将多个行映射到一个对象. 出于您的问题,这意味着您应该获得A. 的所需实体 如果您需要相应的b-权限,则可以通过A进行访问它们.
我正在使用greendao,我已经成功生成了所有必要的类和实体,我可以看到已经创建了我的表格,但是在将断点替换为替换之后,我遇到了一个错误,告诉我"没有这样的桌子存在错误". try { appTimeUsageDao.insertOrReplace(appStats); //} catch (DaoException e) { } catch (Exception e) { Log.e("Error", "Some exception occurred", e); Log.e("APP_TAG", Log.getStackTraceString(e)); } 解决方案 对我而言,这个问题与清单中的允许式标志有关. 此功能是从API 23开始添加的,即使应用程序已卸载,它的效果也是还原设备数据库,因此,如果您试图通过卸载它来清除数据库,将其卸载为Android Restoring IT,则将其工作,类似于iCloud的工作方式. 我可能会
我需要验证一些条件以创建一个完整的查询: queryBuilder qb = getMyObjdao().queryBuilder(); if(SomeCondition) qb.where(MyObjDao.Properties.Prop1.eq(someValue)); else QB.Where(MyObjDao.Properties.prop2.eq(somevalue),myobjdao.properties.prop.prop2.eq(somevalue)); if(某些hoterconcition) qb.where(MyObjDao.Properties.Prop3.eq(someValue)); 其他 qb.whereOr(MyObjDao.Properties.Prop4.eq(someValue)); 那么,是否可以加入查询构建器条件并动态创建查询构建器? 或其他任何东西: (a ='%'+条件1或a
我一直在应用程序中使用Ormlite,我正在考虑是否搬到Greendao. 绩效是该决定的重要组成部分, Greendao的功能页面说: 对于同一给定实体,Greendao插入和更新实体 2倍更快,加载实体的加载速度快4.5倍 实体比ormlite. ... (图和图表更新了10-23-2011) 我以为 ormlite的配置文件生成用于在运行时进行反思. ormlite changlog 表明,在发布配置文件功能后完成了Greendao基准测试,但Greendao功能不介绍Page'''' t明确说明是否为测试生成了静态配置文件. 4.26:9/26/2011(SVN R1978) * Android:添加的字段配置实用程序,以避免使用注释的DAO创建性能问题. 从那时起,也已经进行了Ormlite性能修复,例如 4.40:4/16/2012(SVN R2516) * Android:创建DAO时的大型性能错误修复.外国字段总是使用反射
我使用greendao创建了我的表结构,在更新下表时,我会收到follwing错误: android.database.sqlite.SQLiteException: no such column: BODY_LOG_ENTRY._id: , while compiling: UPDATE BODY_LOG_ENTRY SET 'BODY_LOG_ENTRY._id'=?, 'BODY_LOG_ENTRY.FK_DAY'=?, 'BODY_LOG_ENTRY.DAY_ORDER'=?, 'BODY_LOG_ENTRY.DESCRIPTION'=?, 'BODY_LOG_ENTRY.BODY_WEIGHT'=?, 'BODY_LOG_ENTRY.BODY_SIZE'=?, 'BODY_LOG_ENTRY.BODY_FAT_FORMULA'=?, 'BODY_LOG_ENTRY.BODY_FAT_FORMULA_DATA1'=?, 'BODY_LOG_ENTRY.BODY_FAT_
我在Android中使用Greendao进行数据库映射.到目前为止,一切都很好. 但是现在我有以下问题: 我有一个群集和叶子对象.集群包含许多叶子对象. 如果群集被缩放,则可以在更多的簇和更多的叶子中拆分.这不是严格的树木关系,而是一个大集群有很多叶子,但是一个小簇可以具有该叶子的子集. 基本上一个簇有许多叶子,但叶子也有多个簇,因为叶子的ID是唯一的,并且与簇的关系保存在叶子中,叶子只能在一个簇中放在一个簇中吗? Greendao首页指出,许多关系到许多关系是可能的,但是我如何无法围绕它来建模这种关系. 是否可以建模这样的关系,或者数据结构是Greendao的问题? 解决方案 让我们从 docs 中开始. 虽然Greendao目前不直接支持N:M关系,但您 可以将加入表作为单独的实体建模.在实践中,您经常 拥有具有其他属性的"关系实体",因此您可能想要 无论如何要这样做.在将来的版本中,Greendao可能会直接介绍 N:M关系的支持.
目前我正在这样做: DaoMaster.dropAllTables(getDb(), true); DaoMaster.createAllTables(getDb(), true); 但是,当我试图将实体添加到数据库中时,我会得到崩溃日志,说此表不存在 edit1: 我知道这是因为DB被锁定并且尚未创建表.因此 解决方案 到目前为止,我不必担心表是否锁定;就我而言,我进行以下操作,并且有效: 首先,当app.oncreate执行时,我进行标准初始化. T.devOpenHelper= new DaoMaster.DevOpenHelper(context, "mydatabase", null); T.sqLiteDatabase= T.devOpenHelper.getWritableDatabase(); T.daoMaster= new DaoMaster(T.sqLiteDatabase); T.daoSession
我正在使用Greendao进行Android中的数据库处理.执行许多数据库更改(> 15.000)时,我会收到此错误消息: 数据库'/data/data/...'的连接池无法以30.000002秒的标志0x1授予与线程312(thread-312)的连接. 一切都卡住了.为什么会发生此错误? 解决方案 我无法确定此特定的实现,但是通常有一个连接池备份ORM.连接池打开与数据库的一组连接数,并在关闭它们并打开新连接时将其回收.该错误告诉您的是,它可能达到了限制.这可能是出于多种原因而发生的,一个是DB中可能存在一些僵局,因为您正在更新两张桌子,而两项不同的交易则拿着不同的表格,等待另一个表格释放.或者简单地说,有太多的开放连接,DB或连接池就感到困惑. 对不起,这并不是真正的答案,但是您需要查看Greendao的文档,以了解这可能是如何发生的. 其他解决方案 我想在表上选择一个在事务上使用而无需结束事务的表上的查询时,我收到了此消息.在最后交易块上执行en
我是 Greendao 的新手,我正在努力撰写Dagogogenerator.我遇到的一个问题是我有一个用户表和一个墙壁点表.我希望能够在壁柱表中有两个列,这些列是与用户表的关系(墙所有者和张贴用户),它们可能是相同的用户,但到目前为止看起来还没有有可能在同一表中有两个tomany关系,指向同一表中的一个表. 是否有更好的方法可以做到这一点?我希望能够通过致电.getowner()和.getPoster(). 谢谢 解决方案 您必须为关系设置名称.看看(刚刚改进的)部分,称为有关的关系名称和多个关系关系.它带有一个例子: Property pictureIdProperty = user.addLongProperty("pictureId").getProperty(); Property thumbnailIdProperty = user.addLongProperty("thumbnailId").getProperty(); user.addToOne(p
这是我的样本JSON: { "open":true, "total_products":100, "product":[ { "p_id":1, "price":"5.00", "name":"blah one" }, { "p_id":2, "price":"15.00", "name":"blah two" }, ... ] } 这是我的pojo类: @Entity(nameInDb = "products") public class ProductsPOJO { @SerializedName("open") @Property(nameInDb = "open") private boolean open; @SerializedN
我只是从事一个使用ORM Greendao的Android项目.它使我能够一次将许多实体(显然是对象)插入数据库(一项事务).实际上有一种方法 insertorreplaceIntx(...) 给定对象列表,它作为一个集合的参数.问题在于我的列表有12000个对象,并且插入物会不时地引导到outofmemory例外.我正在考虑一种解决问题并防止未来OOM的聪明方法.我想到的唯一想法是将巨大的集合分为一个子策略(例如,每个元素),并在循环中施加几个小提交,而不是一个巨大的提交.不好的事情是,在此处插入记录和时间至关重要.最后,我不确定是否在提交后进行提交并不会杀死堆.也许在两者之间调用Sleep()方法,让GC清除堆...但是它看上去是一种丑陋的解决方案. 您身边有什么明智的想法? 预先感谢 解决方案 我正在使用Greendao 1.3.1进行项目.一些包含大约200000实体的表(不包含很多属性). 我阅读了CSV的实体并为了加快事物的速度,我开发了一个小
哪种最佳ORM工具可用于Android? 我看到ofmlite和activeAndroid是我讨论的最多的,我的一个朋友建议我使用Greendao.因此,寻找一些可以帮助我决策的知识资源? 我正在寻求自由判断的功能(开源),良好的文档,活动论坛,稳定版本等,这是开发人员所需的. 解决方案 我建议Ormlite的开源免费软件,并且具有良好的文档,也支持Java和Android. 它具有良好的开发人员支持和许多在Ormlite上运行的应用程序(包括我已经开发了:)). 检查此比较Ormlite&green dao的比较 . 其他解决方案 Ormlite和Greendao之间的区别是注释的用法.虽然Ormlite使用注释,但Greendao却没有,如 Ormlite使用的注释取决于反射,这可能会影响性能,尤其是对较慢的Android设备的影响.看到比较Ormlite和Greendao的基准会很有趣. 其他解决方案 我使用的许多库是我使用的一个问题
Greendao. 这是一种简单的方法来显示ListView中实体的所有记录,并且由自动更新列表支持. 也许是拉唑班?如何使用它? 解决方案 有一个外观以下是有关lasylist的一些信息,可以解释原因: 使用Query.listLazy()获得lazylist: 由于记录被缓存在内存中,因此不会自动显示新的插入记录(或停止删除的记录显示). 因此,更新将是不可见的,因为记录没有两次查询. 使用Query.listLazyUncached()获得lazylist: 可以看到已经存在的记录的更新,但前提是当前未显示已更新的记录. 另外,您应该小心,因为我认为插入或删除记录可能会打破此列表. 要将插入物和删除列入列表,您将不得不刷新基础的lazylist并致电notifyDataSetChanged(). 我在适配器中使用了它: public void setLazyList(LazyList list) { if (list != laz
我想向我的Greendao实体添加一些自定义代码.我看到有像受保护的地区一样.但是我不喜欢检查我的git存储库的生成类.我想为此使用继承. 即.我有一个实体User.因此,我希望Greendao生成一个称为UserBase的类.我想通过User扩展并实现这样的方法: public String getFullName() { return this.first + " " + this.last; } 其中first和last是托管属性. ,但我不知道如何告诉Greendao使用类User而不是生成的实体UserBase.有什么方法可以做到吗? 解决方案 我找到了解决这个方法的方法: 您可以输入每个实体的父级: Entity user = schema.addEntity("User"); ... user.setSuperclass("UserBase"); 因此,您可以将UserBase作为抽象类实现. public abs