Android SQLite 和数据库方案上的 ORM [关闭]
Posted
技术标签:
【中文标题】Android SQLite 和数据库方案上的 ORM [关闭]【英文标题】:ORM on Android SQLite and database scheme [closed] 【发布时间】:2011-02-27 18:35:16 【问题描述】:我正在寻找一个非常简单的 ORM 框架,适用于 android for SQLite。我一直在测试ActiveAndroid,但没有一个示例可以在 Eclipse 上构建。 顺便说一句,人们如何在 SQLite for Android 中实现“多对多”关系?您如何反映有关删除行的级联并保证数据库完整性?
【问题讨论】:
请查看 JDXA,这是一个简单、非侵入性且灵活的 Android ORM。 JDXA 支持继承、一对一、一对多和多对多关系。对于多对多关系,行的删除会级联到事务中的中间连接表,从而保持关系另一方的完整性。查看不同的Code Snippets。 【参考方案1】:我是 ORMLite 的主要作者,它有一个 Android 后端,它调用原生 Android 操作系统数据库 API 以支持其 ORM 功能。我们有大量的 Android 开发人员正在成功使用该框架。请参阅此处了解更多信息:
http://ormlite.com/sqlite_java_android_orm.shtml
就多对多关系而言,ORMLite 不支持级联或任何更高级的 ORM 功能,但有一些简单的多对多实现示例:
http://ormlite.com/docs/examples
【讨论】:
易于设置,但学习所有看起来不像的东西的名称非常烦人。它似乎与任何通用数据库术语都不匹配。也许对我来说就是这样,因为我几乎没有使用 SQLite 的经验。花了整整三天时间阅读有关如何拼图的文档,但最终无法使其正常运行。我认为不适合 SQLite 与 java 初学者结合使用。 您能否更具体地了解@G_V 的问题?我可以做些什么来改进文档?我花了很多时间。 我知道这很可能是因为我对原始 SQLite android 库缺乏经验,但是您使用 OrmLiteSqliteOpenHelper 等名称传播了内置 SQLite 库的不理想命名。作为一个初学者,像 Manager 和 Helper 这样的词并没有真正向我展示发生了什么。这周我的时间有点短,但我很快会花一些时间来真正记录我遇到问题的地方,因为我认为你的框架很棒,但同样,作为一个对 SQLite + Android 相当陌生的人,我觉得有如何让它工作的一些缺失步骤。【参考方案2】:对于那些仍在寻找 ORM 解决方案的人,我几个月前发布了greenDAO。 Android Market 中的几个应用程序已经在使用它。与其他 Android ORM 工具不同,greenDAO 的主要设计目标之一是性能。对于许多操作,它应该比其他解决方案快几倍,例如加载实体的速度比 ORMLite 快 4-5 倍。
它支持关系。文档描述了how to use relations and how you could model many-to-many relations。
删除级联是一件危险的事情,因此不受greenDAO的支持。更安全的方法是在事务中自下而上删除实体。
【讨论】:
我尝试了greendao,这个概念很棒,你正在生成实体和dao,但是你编写生成器的方式并不那么聪明。 @greenrobot 关于在层次结构(与同一实体的关系)的情况下如何执行自下而上删除的任何提示? @RobertoAndrade 看不到与 greenDAO 的连接。使用 Set 跟踪已删除的对象? 试过 greendao 但设置起来很痛苦,而且它几乎需要生成实体类,而且似乎还添加了一个与实体本身无关的长 id 字段,这会破坏生成的网络服务调用。这个想法很好,但我不知道那些对 SQLite 还不是很有经验的人如何使用它。在我看来,该文档还假设对具体实现细节有太多了解。 Android 团队几乎每个月都会更改这些细节也无济于事。【参考方案3】:我自己写了一个轻量级的 ORM 并称之为 Androrm。因为我喜欢 Django,所以查询语法看起来很相似。请尝试给我反馈:)
网页:http://androrm.com/
也在 GitHub 上:https://github.com/androrm/androrm
【讨论】:
目前无法下载二进制版本。你知道吗?【参考方案4】:以下是我如何使用 SORMA - 一个 Android 内容提供程序解决方案。
将您的 Java POJO 映射到数据库表:
@Table(
name="contact",
keyColumn="id",
autoId=true,
create="create table if not exists contact ("
+ " id INTEGER primary key autoincrement"
+ ", firstName text"
+ ", lastName text"
+ ", married tinyint"
+ ")"
)
public class Contact
private Integer id;
private String firstName;
private String lastName;
private boolean married;
......
创建内容提供者类:
import com.gaoshin.sorma.annotation.ContentProvider;
import com.gaoshin.sorma.annotation.SormaContentProvider;
@ContentProvider(
version = 1,
mappingClasses =
Contact.class,
Phone.class
)
public class AddressBookContentProvider extends SormaContentProvider
在 AndroidManifest.xml 中定义内容提供者:
<provider
android:authorities="com.gaoshin.sorma.examples.addressbook.AddressBookContentProvider"
android:name="com.gaoshin.sorma.examples.addressbook.AddressBookContentProvider" />
使用内容提供者:
sorma = SORMA.getInstance(getBaseContext(), AddressBookContentProvider.class);
// insert contact
Contact contact = new Contact();
contact.setFirstName("fname1");
contact.setLastName("lname1");
sorma.insert(contact);
完成!
(您可以找到更多信息here。)
【讨论】:
无法访问 SORMA 教程的链接。【参考方案5】:我使用并且是 Mechanoid DB 的作者,它提供了一个类似 dsl 的 sqlite,用于生成支持 sqlite 的内容提供程序。
检查一下:
http://www.robotoworks.com/mechanoid-plugin/mechanoid-db/
【讨论】:
干得好!!用了挺满意的! 感谢您的好心cmets! :) 这个概念看起来很棒,背后的想法很好,一定要尝试一下。【参考方案6】:试试SQLiteGen。它不像hibernate那样功能丰富,但是你可以在Eclipse中用它生成一些简单的ORM类。
希望有帮助!
【讨论】:
以上是关于Android SQLite 和数据库方案上的 ORM [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
android 上的 SQLite 数据库、多线程、锁和帐户同步
如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?