哪个是适用于Android的最佳ORM工具?
我看到ORMlite和ActiveAndroid是最受讨论的,我的一个朋友建议我使用GreenDAO.那么寻找一些可以帮助我做决策的知识资源?
我希望判断的功能是免费提供(开源),良好的文档,活动论坛,稳定版本等,这是开发人员所需要的.
我正在评估GreenDAO在我将要开发的商业Android应用程序中的考虑,并希望确定架构更新的迁移路径.
我是否正确断言我必须编写一个自定义OpenHelper,它提供onUpdate()并根据新模式提取变换并存储数据?这个假设提出了一些有关呼叫排序和责任划分的有趣问题.
我无法找到有关GreenDAO的架构更新和数据迁移的任何文档.
以下是我就此主题撰写的一系列博客文章:
我正在寻找有关如何在Android Studio中导入GreenDao的明确分步说明.
我之前在AS中使用过它,但未能再次使用它.有一些教程,但它们似乎不适用于最新版本的AS.
当我从github克隆时,我得到一个示例项目的东西等.有没有办法安装GreenDaoGenerator没有这些额外的东西?
只是寻找最新的逐步解释.
更新:我建议现在使用Realm.io!看看这个!:-)
任何帮助,将不胜感激!
我一直在我的应用程序中使用ORMLite,我正在考虑是否转向greenDAO.
性能是该决定的重要组成部分,greenDAO的功能页面说:
对于相同的给定实体,greenDAO插入和更新实体的速度提高了2倍,并且加载实体的速度比ORMLite快4.5倍.
...
(图表和图表更新于10-23-2011)
我认为ORMLite的配置文件生成步骤应该在运行时不需要反射.
ORMLite changlog表明greenDAO基准测试是在配置文件功能发布后完成的,但是greenDAO功能页面没有明确说明是否为测试生成了静态配置文件.
4.26:9/26/2011(svn r1978)
*ANDROID:添加了字段配置实用程序,以避免带注释的Dao创建性能问题.
从那以后,也有ORMLite性能修复,例如
4.40:4/16/2012(svn r2516)
*ANDROID:创建DAO时出现大的性能错误修复.外部字段总是使用反射而不是表格配置.
谁能确认greenDAO和ORMLite之间是否仍有很大的性能差异?谢谢!
我正在使用GreenDAO在Android中进行数据库处理.当执行许多数据库更改(> 15.000)时,我收到此错误消息:
数据库'/ data/data/...'的连接池无法使用标志0x1授予与线程312(Thread-312)的连接30.000002秒.
一切都被困住了.为什么会发生这种错误?
我见过另一个关于使用green dao进行模式升级/迁移的问题(这里)
在该答案中有许多链接可用于在进行模式升级时使用的良好模式 - 但是没有关于您实际对数据进行的操作的示例,以便正确地迁移它并且我无法找到任何内容.
在我的情况下,我的迁移非常简单 - 我不希望转换任何现有数据,我只需要在我的模式中添加一些新表,我怀疑这是一种相当常见的情况.
在不删除用户已保存的数据的情况下,将新表添加到架构的最简单方法是什么?非常感谢一个具体的例子.
如果greenDao提供了一个类似于DevOpenHelper的类,它将简单地添加先前不存在于模式中的新表/列而不先删除现有的tabes/data,这将是非常棒的.
我使用以下ProGuard规则:
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { *; } -keep class **$Properties -keep class org.greenrobot.greendao.** -keepclassmembers class org.greenrobot.greendao.** { *; } # If you do not use SQLCipher: -dontwarn org.greenrobot.greendao.database.** # If you do not use RxJava: -dontwarn rx.**
启动应用程序时,我收到以下崩溃日志:
java.lang.RuntimeException: Unable to create application my.app.package.MyApplication: org.greenrobot.greendao.DaoException: Could not init DAOConfig at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4569) at android.app.ActivityThread.access$1500(ActivityThread.java:148) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) Caused by: org.greenrobot.greendao.DaoException: Could not init DAOConfig at …
我正在使用greenDAO,到目前为止一切都很顺利.文档或网站(或任何地方:()似乎没有涉及的一件事是它如何处理线程安全.
我知道其他地方提到的基础知识,比如"使用单个dao会话"(Android + SQLite的一般做法),我非常了解Java内存模型.库内部甚至看起来是线程安全的,或者至少是用这种意图构建的.但我见过的一切都没有涵盖这个:
greenDAO默认缓存实体. 这对于完全单线程程序来说非常好 - 透明和大多数用途的大量性能提升.但是,如果我loadAll()
然后修改其中一个元素,我将在我的应用程序中全局修改同一个对象.如果我在主线程上使用它(例如用于显示),并在后台线程上更新数据库(正确和正确),除非特别小心,否则会出现明显的线程问题.
greenDAO是否在"引擎盖下"做任何事情以防止常见的应用程序级线程问题?例如,修改UI线程中的缓存实体,同时将其保存在后台线程中(更好的希望它们不会交错!特别是在修改列表时!)?是否有任何"最佳实践"来防范它们,超出了一般的线程安全问题(即greenDAO期望和适用的东西)?或者从多线程应用程序的安全角度看整个缓存是否存在致命缺陷?
我选择了greenDAO,因为它的网站声称它是Android上最快的ORM系统之一.对于我的失望,它需要40秒才能在三星i9001上插入600条记录.我不确定我做错了什么.
你能建议什么来减少执行这些操作所需的时间吗?
发生器代码:
private static void addNewsArticle(Schema schema) {
Entity article = schema.addEntity("NewsArticle");
article.addIdProperty().autoincrement();
article.addStringProperty("title").notNull();
article.addStringProperty("body").notNull();
article.addStringProperty("shortDescription").notNull();
article.addStringProperty("thumb");
article.addDateProperty("date").notNull();
}
Run Code Online (Sandbox Code Playgroud)
插入
Date now = Calendar.getInstance().getTime();
for (int i = 0; i < 600; i++) {
NewsArticle testArticle = new NewsArticle();
testArticle.setTitle("title-text" + i);
testArticle.setBody("body-text" + i);
testArticle.setShortDescription("short-text" + i);
testArticle.setDate(now);
newsArticleDao.insert(testArticle);
}
Run Code Online (Sandbox Code Playgroud) 目前我这样做:
DaoMaster.dropAllTables(getDb(), true);
DaoMaster.createAllTables(getDb(), true);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将实体添加到数据库时,我收到崩溃日志,说这个表不存在
Edit1:我知道发生这种情况是因为数据库被锁定而且还没有创建表.所以我正在解决这个问题 - 如何知道这些表是否被锁定在grrenDao/Sqlite中?