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 导出上的 Godot SQLite 数据库

如何将 Android 手机上的 SQLite 数据库与服务器上的 MySQL 数据库同步?

在 Android 上的 SQLite 中创建多个表

我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]

cordova-sqlite-ext 可以读取 sd 卡(Android)上的数据库吗?