如果一个实体拥有属性和方法的实体一个什么属性 它可能会被映射到多个关系模式中?

常规实体类型的特征 强实体有簡单属性,有复合属性无多值属性

  • 为E-R图中的每个常规(强)实体类型E,创建一个关系模式E
    • 实体类型E的简单属性直接放入关系模式E
    • 实体类型E嘚复合属性,只把其简单成员属性放入关系模式E
  • 如果实体类型E有多个候选键选择其中一个,作为关系模式E的主键其他的作为备用键
  • 实體类型E的每一个实体实例,对应关系模式E的一个元组
  • 为E-R图中二元一对多联系的每个参与实体类型E1和E2创建关系模式E1和E2
  • 使用一个新的关系模式R来表示两个参与实体之间的多对多联系
    • 主键为两个参与实体的主键的并集
    • 创建2个外键约束,参照引用相应的参与实体
    • 联系的描述性属性放入到这个新添加的关系模式R中

第一种映射方法:外键方法

  • 为E-R图中二元一对多联系的每个参与实体类型E1和E2,创建关系模式E1和E2
  • 选中参与联系的多方实体所对应的关系模式为其添加一个外键(是参与联系的一方实体的主键)
  • 联系的属性,也一同放入多方实体
  • 多方是子实体┅方是父实体

部分参与的时候使用null值进行合并

第二种映射方法:添加关联关系法 二元多对多特例

第一种映射方法:外键方法 同二元一对多,任选一方合并外键

第二种映射方法:合并关系方法 为E-R图中二元一对一联系的两个参与实体类型E1和E2创建关系模式E,包含了这两者的全部屬性和联系的属性

第三种映射方法:添加关联关系法 二元一对多特例

  • 为弱实体集A创建关系模式A 关系模式A的属性由所有的弱实体集属性加上所依赖的强实体集的主键构成 关系模式A的主键由强实体集B的主键加上弱实体集A的分辨符构成

  • 在关系模式A 上建立外键约束 外键约束具有“级聯删除”规则

将包含多值属性M实体集R转换为两个关系R1和R2

  • R1包括该实体集中除了多值属性以外的所有属性
    • 实体集R的主码构成R2的主键
    • 多值属性M本身(此时已经转换为单值了!)

R2的主键R1主键加单值属性M 外键约束具有“级联删除”规则(cascade)适用于update和delete

映射方法 先考虑多值属性,然后复匼属性

  • 为E-R图中n元联系的每个参与实体类型E1E2,…En创建关系模式E1,E2…En
  • 为创建一个新的关系模式R,表示这个n元联系
    • 把所有参与实体的主键莋为关系模式R的外键
    • 关系模式R的主键通常由所有参与n元联系的实体的主键的并集构成
      • 如果有一个实体类型E的基数约束是1那么R的主键就不包括这样的外键属性
    • n元联系的描述性属性也应该加入到关系模式R中

为关联实体创建一个关系模式R

  • 如果关联实体还没有分配主键
    • 把所有参与實体的主键的并集作为关联实体对应的关系模式R的主键
    • 把所有参与实体的主键作为关联实体对应的关系模式R的外键
  • 如果关联实体已经分配叻主键
    • 关联实体的主键可以作为其所对应的关系模式R的主键
    • 把所有参与实体的主键作为关联实体对应的关系模式R的外键

一对多递归联系 多對多递归联系

直接使用定义该聚集的联系集所创建出来的关系模式当作二元联系即可

  • 为高层实体集创建一个模式;
  • 为每个低层实体集创建┅个关系模式:
    • 属性包括对应于低层实体集的每个属性
    • 属性包括对应于高层实体集主码的每个属性
  • 高层实体集的主码属性同时也是所有低層实体集的主码属性
  • 在低层实体集上建立外码约束,其主码属性参照创建自高层实体集的关系的主码

如果概化是不相交且完全的 : 不存在哃时属于两个同级的低层实体集的实体高层实体集的任何实体都是某个低层实体集的成员

  • 不需要为高层实体集创建任何关系模式
  • 只需要為每个低层实体集创建一个关系模式
    • 属性包括对应于低层实体集的每个属性
    • 属性同时包括对应于高层实体集的每个属性
  • 将高层实体集的主碼作为低层实体集的主码


这里给大家推荐一个在线软件复杂项交易平台:米鼠网

米鼠网自成立以来一直专注于从事、、等,始终秉承“专業的服务易用的产品”的经营理念,以“提供高品质的服务、满足客户的需求、携手共创双赢”为企业目标为中国境内企业提供国际囮、专业化、个性化、的软件项目解决方案,我司拥有属性和方法的实体一流的项目经理团队具备过硬的软件项目设计和实施能力,为铨国不同行业客户提供优质的产品和服务得到了客户的广泛赞誉。

greenDAO是一个开源的Android ORM使SQLite数据庫的开发再次变得有趣。 它减轻了开发者处理底层的数据库需求同一时候节省开发时间。

SQLite是一个非常不错的关系型数据库 尽管如此,編写SQL和解析查询结果仍然是相当乏味和耗时的任务 greenDAO通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”)来解决这些问题

这样。您能够使用简单的面向对象的API来存储更新。删除和查询Java对象


  • 涵盖关系和连接且易用的强大API
  • 迷你开源库(<100KB),减少工程构建时间同一時候避免65k方法限制
  • 数据库加密:greenDAO支持SQLCipher以保证用户的数据安全
  • 强大的社区:超过5000 GitHub星星表明我们拥有属性和方法的实体一个强大而活跃的社区

本教程将引导你完毕一个简单的greenDAO演示样例项目 克隆代码并运行它,或者直接在

你能够通过键入一些文本来加入新笔记,並通过点击现有笔记删除笔记

一起看下代码:在src文件夹中,你会发现一个实体类Note.java 它被持久化到数据库并包括Note的全部数据。如id凝视文本和创建日期。

通常实体是在数据库中持久化的类(比如。一个对象的一行) 实体包括映射到数据库列的属性。

要学习怎样加入一些笔记请看一下NoteActivity类。 首先我们必须为我们的Note类准备一个DAO对象,我们在onCreate()中做:

当用户单击加入button时将调用addNote()方法。 在这里我们创建一个新的Note对象。并将其传递给DAO insert()方法以将其插入到数据库中:

注意。我们在创建笔记的时候没有传递id 在这样的情況下,数据库决定note id DAO负责在从插入操作返回之前自己主动设置新的ID(请參阅日志语句)。

你已经看到了DAO可是怎样初始化greenDAO和底層数据库呢? 通常你须要init一个DaoSession它通常在整个应用程序中的Application类中运行一次:

为了扩展我们的笔记或创建新实体,你仅仅需妀动或创建Java类并以同样的方式注解它们。

有关具体信息请參阅。

(这个下面已经翻译出来)

greenDAO是Android的对象/关系映射(ORM)工具 它为关系数據库SQLite提供了一个面向对象的接口。像greenDAO一类的ORM工具为你做非常多反复性的任务提供简单的数据接口。

一旦项目构建唍毕你就能够在Android项目中開始使用greenDAO了。

下面核心类是greenDAO的基本接口:

DaoSession:管理特定模式的全部可用DAO对象你能够使用当中一个的getter方法获取DAO对象。 DaoSession还为实体提供了一些通用的持久性方法如插入,载入更新,刷新和删除 最后。DaoSession对象也跟踪identity scope

有关很多其它具体信息,请查看

DAO:数據訪问对象(DAO)用于实体的持久化和查询。

通常实体是使用标准Java属性(如POJO或JavaBean)表示数据库行的对象。

最后下面代码演示樣例说明了初始化数据库和核心greenDAO类的第一步


 
该演示样例假设存在一个Note实体。


有了它的DAO(noteDao对象)我们能够调用这个特定实体的持久化操作。


 

 
要在项目中使用greenDAO您须要创建一个表示应用程序中持久数据的实体模型。 然后基于此模型。greenDAO为DAO类生成Java代码
模型本身是使用帶有注解的Java类定义的。
要使用旧式生成器创建模式请參阅。
下側的图示描写叙述了greenDAO所基于的元模型
 
无需不论什么其它配置就能够開始使用greenDAO Gradle插件。可是至少应该像下面这样设置下模式版本号:
此外,greendao配置元素支持一系列配置选项:
  • schemaVersion:数据库模式的当前版本号 这由* OpenHelpers類用于在模式版本号之间迁移。 假设更改实体/数据库模式则必须添加此值。
 
 
greenDAO 3使用注解来定义模式和实体 这里有一个简单的樣例:
@Entity注解将Java类User转换为数据库支持的实体。 这也将指示greenDAO生成必要的代码(比如DAO)
注意:仅支持Java类。 假设你喜欢还有一种语言如Kotlin。你的實体类仍然必须是Java
 
正如在上面的演示样例中看到的,@Entity注解将Java类标记为greenDAO的持久化的实体
尽管通常没有不论什么额外的參数,在使用@Entity嘚时候你仍然能够配置一些细节:
注意当使用Gradle插件时。 暂时,继续使用你的
 
@Id注解选择long / Long属性作为实体ID。 在数据库术语中它昰主键。
參数autoincrement是一个标志使ID值不断添加(不重用旧值)。
@Property同意你定义一个当前属性映射到的数据库列的非默认名称 假设为空。greenDAO将以SQL-ish方式使用字段名(大写字母下划线取代驼峰,比如customName将成为CUSTOM_NAME) 注意:当前仅仅能使用内联常量来指定列名称。


@Transient标记要从持久性中排除的属性
将它们用于暂时状态等。
或者也能够使用Java中的transient关键字。
 
眼下实体必须具有long或Long属性作为其主键。

要解决此问题请将你的鍵属性定义为其它属性,但为其创建唯一索引:
 
在属性中使用@Index可为对应的数据库列创建数据库索引 使用下面參数自己定义:
name:假设你不喜欢greenDAO为索引生成的默认名称。你能够在这里指定你的名字
unique:向索引加入UNIQUE约束。强制全部值是唯一的

注意。SQLite也隐式地为它创建┅个索引
 
greenDAO尝试使用合理的默认值。以便开发者每一个都一一配置
比如。数据库側的表和列名称派生自实体和属性名称 而不是茬Java中使用的骆驼案例样式。默认数据库名称使用大写使用下划线分隔单词。
 
要了解怎样加入一对一和多对多关系请參阅(下面已经翻译)
 
一旦实体模式就位,你就能够通过在IDE中使用“Make project”来触发代码生成过程

假设在更改实体类之后遇到错误,请尝试又一次生成項目以确保清除旧生成的类。
11. 改动生成的代码
 
 
greenDAO 3中的实体类由开发者创建和编辑
然而,在代码生成过程中greenDAO可能会添加實体的源代码。
greenDAO将为它创建的方法和字段加入一个@Generated注解以通知开发者并防止不论什么代码丢失。
在大多数情况下你不必关心使用@Generated注解嘚代码。
作为预防措施greenDAO不会覆盖现有代码,而且假设手动更改生成的代码会引发错误:
正如错误消息所暗示的通常有两种方法来解决此问题:
  • 将更改还原为使用@Generated注解的代码。

    或者你也能够全然删除更改的构造函数或方法。 它们将与下一个版本号又一次生成

  • 这将告诉greenDAO詠远不要触摸带注解的代码。 请记住你的更改可能会中断实体和其它greenDAO之间的约定。 此外未来的greenDAO版本号可能期望生成的方法中有不同的玳码。 所以要慎重。

    同一时候採用单元測试的方法来避免麻烦是个不错的选择。

 
 
不再支持旧版本号的greenDAO中使用的KEEP
可是,假设Gradle插件检測到KEEP FIELDS部分它将自己主动使用@Transient凝视字段。 之后可能会删除周围的KEEP FIELDS凝视。

 

 
(生成的)DaoSession类是greenDAO的中心接口之中的一个 DaoSession提供开发者訪问基本实体操作和相较于DAO的更完整的操作集合。
 
如“入门”部分所述你须要创建一个DaoMaster以获取DaoSession:
请注意,数据库连接属于DaoMaster部分因此多个会话指的是同一个数据库连接。
因此我们能够相当快地创建新会话。
可是每一个会话得分配存储空间,特别是实体的会话“缓存”
 
假设有两个查询返回同样的数据库对象,则使用多少个Java对象:一个或两个 它全然取决于Identity scope。
greenDAO中的默认值(行为是可配置的)是多个查询返回对同一Java对象的引用 比如。从ID为42的USER表中载入User对象会为这两个查询返回同样的Java对象
这样的方式的副作用是某种实體“缓存”。 假设实体对象在内存中仍然存在(greenDAO在这里使用弱引用)则不会再次构造该实体。 此外greenDAO不运行数据库查询以更新实体值。 楿反对象从会话快速缓存“马上”返回,这个速度是相当快的
 
要清除整个会话的identity scope,以便不返回“缓存”对象:
 
本文档页面当湔信息有限 请參考。

 

 
查询返回符合特定条件的实体 在greenDAO中。你能够使用原始SQL来制定查询或者使用QueryBuilder API,相对而言后者会哽easy
此外,查询支持懒载入结果当在大结果集上操作时。能够节省内存和性能
 
编写SQL可能非常困难,而且easy出现错误这些错誤仅在运行时被察觉。 QueryBuilder类同意你为没有SQL的实体构建自己定义查询并帮助在编译时检測错误。
简单条件演示样例:查询全部名为“Joe”的用戶按姓氏排序:
嵌套条件演示样例:获取1970年10月或之后出生的名为“Joe”的用户。
假设我们有一个用户的生日作为年月和日的单独属性。 嘫后我们能够用更正式的方式表示条件:名字是“Joe”AND(出生年份大于1970年或(出生年份是1970年,出生年份等于或大于10))( 10月10月)。
2. 限制偏移和分页
 
 
有时候,你仅仅须要一个查询结果的子集比如在用户界面中显示的前10个元素。 当拥有属性和方法的实体大量实体时这是非常实用的(节省资源的),而且你也不能使用“where”语句来限制结果

limit(int):限制查询返回的结果数。
offset(int):结合limit(int)设置查询结果的偏移量 将跳过第一个偏移结果,而且结果的总数将受limit(int)限制 你不能使用offset无限制(int)。
3. 使用洎己定义类型作为參数
 
 
通常greenDAO以透明方式映射查询中使用的类型。 比如boolean被映射到INTEGER。具有0或1个值而且Date被映射到(long)INTEGER值。
自己定义类型是┅个例外:在构建查询时总是必须使用数据库值类型。 比如假设使用转换器将枚举类型映射到int值,则应在查询中使用int值
 
Query类表礻能够多次运行的查询。当你使用QueryBuilder中的一个方法来获取结果(如list())时运行过程中QueryBuilder 内部会使用Query 类。假设要多次运行同一个查询应该在QueryBuilder 上調用build()来创建查询而并不是运行它。
greenDAO支持唯一结果(0或1个结果)和结果列表
假设你想在Query (或QueryBuilder )上有唯一的结果调用unique()。这将为你提供单个结果或者在没有找到匹配的实体时返回null
假设你的用例禁止null作为结果,调用uniqueOrThrow()将保证返回一个非空的实体(否则会抛出一个DaoException)
假设希望多个實体作为查询结果,请使用下面方法之中的一个:
  • list()全部实体都载入到内存中结果一般是一个简单的ArrayList。
  • listLazy()实体按需载入到内存中一旦列表Φ的元素第一次被訪问。它将被载入并缓存以备将来使用使用完后必须关闭。
  • listLazyUncached()一个“虚拟”实体列表:对列表元素的不论什么訪问都导致从数据库载入其数据使用完后必须关闭。
  • listIterator()让我们通过按需载入数据(lazily)来遍历结果数据未缓存。使用完后必须关闭
 

这就是为什么伱必须确保关闭惰性列表和迭代器(通常在try / finally块)。
来自listLazy()的缓存延迟列表和listIterator()中的惰性迭代器在訪问或遍历全部元素后自己主动关闭游标
假設列表处理过早停止,开发者须要自己调用close()进行处理
 
使用QueryBuilder构建查询后,这个Query对象是能够被反复使用的 这比总是创建新的Query对象哽高效。
假设查询參数不更改你能够继续调用列表/唯一结果等方法进行查询操作。
可是參数是能够被更改的:通过调用setParameter方法来更改參數。 当前通过基于零的參数索引来寻址各个參数。 索引基于我们传入到QueryBuilder的顺序 比如:
6. 在多线程中运行查询
 
 
假设在哆个线程中使用查询,则必须调用forCurrentThread()获取当前线程的Query实例 Query实例绑定到构建查询的那个线程。
你能够安全地设置Query对象的參数不涉及到其它线程。
假设一个线程尝试改动查询參数或运行已经绑定到还有一个线程的查询绑系统将抛出异常。 用这样的方式你就不再须要synchronized语呴了。 实际上你应该避免锁定。由于假设并发事务使用同样的Query对象这可能导致死锁。
每次调用forCurrentThread()时查询參数将会被设置成使用构建器構建查询时的參数。
 

这样你能够将不论什么SQL片段作为WHERE子句传递给查询构建器。
下面代码是一个理论演示样例说明怎样运行子選择(使用连接将是更好的解决方式):
另外一种方法不使用QueryBuilder。 而是使用queryRaw或queryRawCreate方法 它们同意您传递一个原始SQL字符串,它附加在SELECT和实体列之後 这样,你能够有不论什么WHERE和ORDER BY子句来选择实体
能够使用别名T来引用实体表。
下面演示样例显示怎样创建一个查询该查询使用连接检索名为“admin”的组的用户(同样,greenDAO本身支持连接这仅仅是为了演示):
注意:能够使用生成的常量引用表和列名称。 这是建议避免打字错誤由于编译器将检查名称。
在实体的DAO中你将发现TABLENAME包括数据库表的名称。以及一个内部类属性当中包括全部属性的常量(字段columnName)。
 
批量删除不会删除单个实体可是全部实体都符合一些条件。

***API的这一部分能够在将来改变比如能够加入方便的方法。
请注意批量删除眼下不影响identity scope中的实体,比如假设已删除的实体先前已缓存,并通过其ID(载入方法)进行訪问则能够“复活”。 请考虑马上清除身份范围假设这可能会导致你的用例的问题。*
 
您的查询不返回预期结果 在QueryBuilder上启用SQL和參数记录有两个静态标志:
当调用当Φ一个构建方法时,它们将记录生成的SQL命令和传递的值并将它们与实际所需的值进行比較。
此外它可能有助于将生成的SQL拷贝到一些SQLite数據库浏览器,并看看它怎样运行

 

 
 
非普通查询通常须要几个实体类型(表)的数据。 在SQL世界中能够通过使用连接條件“连接”两个或多个表来实现。
让我们考虑一个实体User它与Address实体具有一对多的关系。 然后我们要查询居住在“Sesame Street”上的用户:我们必須使用用户ID与User实体加入Address实体,并在Address实体上定义WHERE条件:
连接须要目标实体类作为每一个实体的參数和连接属性 在演示样例中,仅仅定义Address实體的join属性由于默认使用主键属性。 换句话说查询导致用户具有UserId等于User实体ID而且还具有特定街道的Address实体。
2. 查询构建器连接API
 
 
甴于能够在使用主键属性时省略join属性因此QueryBuilder中提供了三种重载的连接方法:
 
此外。greenDAO同意跨多个表连接 在这里,使用还有一个连接和目标实体定义连接 在这样的情况下,第一连接的目的实体变为第二联接的起始实体

让我们看看还有一个有三个实体的样例:城市。国家和大陆 假设我们要查询欧洲全部人口至少100万的全部城市。它将例如以下所看到的:
4. 自连接/树演示样例
 
 
连接也能夠与引用单个实体的关系一起使用 比如,我们想找到全部的人他的祖父的名字是“林肯”。 让我们假设我们有一个具有指向同一个实體的fatherId属性的Person实体 然后,查询构建例如以下:
如您所见连接是构建跨多个实体类型或关系的查询的强大工具。

 

实體之间的关系(一对多)

 
 
 
数据库表能够使用1:1,1:N或N:M关系彼此相关 假设你刚接触数据库关系,你须要在我们讨论ORM之前快速的恶补一丅 这里有一些关于数据库关系的网络链接。


在greenDAO中实体使用一对一或一对多关系。 比如假设要在greenDAO中建模1:n关系,则将具有一对一关系囷一对多关系 可是,请注意一对一和一对多关系不会彼此连接。因此你必须更新两者
 
@ToOne注解定义与还有一个实体(一個实体对象)的关系。 将其应用于包括其它实体对象的属性
在内部。greenDAO须要一个指向由joinProperty參数指定的目标实体的ID的附加属性
假设此參数不存在,则会自己主动创建一个附加列来保存这个信息
一对一关系的getter方法(在此演示样例中为getCustomer())在其第一次调用时延迟解析目标实体。
兴許调用将马上返回先前解析的对象
注意,假设更改外键属性(这里为customerId)下一次对getter(getCustomer())的调用将解析实体以获取更新的ID。
另外假设设置了一个新实体(setCustomer()),外键属性(customerId)也将被更新
注意:要热载入一对一关系,请使用实体DAO类的loadDeep()和queryDeep() 这将解析与单个数据库查询具有全部一对一关系的实体。 假设你总是訪问相关实体这将有助于性能的提高。
 
@ToMany定义与一组其它实体(多个实体对潒)的关系
将此应用于表示目标实体列表的属性。
引用的实体必须有一个或多个属性指向拥有属性和方法的实体@ToMany的实体
有三种可能性來指定关系映射,仅仅使用当中一个就可以:
  • referencedJoinProperty參数:指定目标实体中指向此实体标识的“外键”属性的名称
 
  • joinProperties參数:对于更复杂的关系,伱能够指定一列@JoinProperty注解 每一个@JoinProperty须要原始实体中的源属性和目标实体中的引用属性。
 
  • @JoinEntity:假设你正在运行涉及还有一个连接实体/表的N:M(多对哆)关系请在属性上放置此附加注解。
 
一旦运行插件将生成一个getter来解析被引用实体的列表。 比如在前两种情况下:

 
3. 解析和更新对多关系
 
 
多对多关系在第一个请求上解析比較慢然后将List对象缓存在实体中。 因此兴许採用get方法调用将不会查询数据库。
哽新多对多关系须要一些额外的工作 由于缓存了一对多列表。所以当将相关实体加入到数据库时它们不会更新。 下面代码说明了这样嘚行为:

 
因此要加入新的相关实体,请将它们手动加入到源实体的多对多列表中例如以下:


同样。你能够删除相关实体例如以下:


加入。更新或删除很多相关实体时能够使用重置方法清除缓存的列表。


然后下一个get将又一次查询相关实体:


 
 
有时你想在两个方姠上建立1:N关系 在greenDAO中,你必须加入一对一和一对多关系才干实现此目的
下面演示样例显示了客户和订单实体的完整建模。我们之前用莋演示样例 这次。我们使用customerId属性创建两个关系:
让我们假设我们有一个订单实体
使用这两种关系,我们能够得到客户和客户所做的全蔀订单:

 
5. 演示样例:建模树关系
 
 
您能够通过使用指向自身的一对一和多对一关系建模实体来建模树关系:
生成的实体哃意您导航其父级和子级:
6. 很多其它演示样例
 
 
查看项目以获取完整的Android应用演示样例
此外。附带了几个关系測试 当中,除了其它和之外能够用作进一步的演示样例。

 

自己定义类型:将类和枚举映射到数据库值

 
 
自巳定义类型同意实体具有不论什么类型的属性 默认情况下,greenDAO支持下面类型
1. 转换注解和属性转换器
 
 
要加入对自己定義类型的支持能够使用@Convert凝视将它们映射到当中一种受支持的类型。

比如你能够使用自己定义Color类在实体中定义颜色,并将其映射到整数

这是将枚举映射到整数的演示样例:
注意:假设你在实体类中定义自己定义类型或转换器,它们必须是静态的
不要忘记正确处理空值 - 通常,假设输入为null则应返回null。
转换器的数据库类型意义上不是SQLite类型而是由greenDAO提供的原始Java类型。
建议使用易于转换的基本类型(intlong。byte数组String。…)
注意:为了获得最佳性能。greenDAO将为全部转换使用单个转换器实例 确保转换器除了无參数默认构造函数之外没有不论什么其它构慥函数。
另外使它线程安全,由于它可能在多个实体上并发调用
2. 怎样正确转换枚举
 
 
枚举在像实体这样的数据对象中使非经常常使用的。 当持久化枚举时有下面几个不错的方法:
  • 不要持久化枚举的序号或名称:两者都不稳定,而且非常有可能下次编辑枚举定义的时候就变化了
  • 使用stable ids:在你的枚举中定义一个保证稳定的自己定义属性(整数或字符串)。

    使用它来进行持久性映射

  • 未知值:定义一个UNKNOWN枚举值。 它能够用于处理空值或未知值 这将同意你处理像旧的枚举值被删除而不会崩溃您的应用程序的情况。
 
3. 自己定义类型在查询中的处理
 
 
QueryBuilder不知道自己定义类型 您必须对查询使用原语类型(比如在WHERE參数中)。
还要注意在数据库Φ完毕的操作总是引用原始类型。比如在ORDER BY子句中

 

 
greenDAO支持加密的数据库来保护敏感数据。
尽管较新版本号的Android支持文件系统加密泹Android本身并不为数据库文件提供加密。 因此假设攻击者获得对数据库文件的訪问(比如通过利用安全缺陷或欺骗有根的设备的用户),攻擊者能够訪问该数据库内的全部数据
使用受密码保护的加密数据库添加了额外的安全层。 它防止攻击者简单地打开数据库文件
 
由于Android不支持加密数据库,所以你须要在APK中捆绑SQLite的自己定义构建
这些定制构建包括CPU相关和本地代码。
所以你的APK大小将添加几个MByte 因此,你应该仅仅使用加密假设你真的须要它。
 
greenDAO直接支持带有绑定的
 
请參阅。了解怎样向项目加入SQLCipher
 
确保使用DaoMaster中提供的OpenHelper的子类来创建数据库实例。


最后像往常一样将数据库传递给DaoMaster:
 
greenDAO对全部数据库交互使用一个小型的抽象层,因此支持标准和非标准的SQLite实现:
 
这使您能够轻松地从标准数据库切换到加密数据库由于在针对DaoSession和单个DAO时,代码将是同样的
 
数据库抽象同意用Robolectric进行单元測试。
即使你的应用程序使用加密的数据库你的測试也能够使用未加密的数据库。
 

这里是我们注意到的问题(与greenDAO无关):
  • SQLCipher比近期的SQLiteDatabase实现锁定很多其它 这不仅减少了并发性,而且添加了死锁的机会
 

 

 
个人翻译,用于后面查阅若有不当请担待~
原文链接:

实体-联系(entity-relationship E-R)数据模型的提出旨在方便数据库的设计,它是通过允许定义数据库全局逻辑结构的企业模式实现的

E-R数据模型采用了三个基本概念:实体集,联系集和属性

實体(entity)是现实世界中可区别于所有其他对象的一个"事物"或"对象",实体通过一组属性(attribute)来表示

实体集(entity set)是相同类型即具有相同属性的一个实体集匼,例如一所大学的所有教师可定义为实体集instructor。

联系集(relationship)是指多个实体间的相互关联例如,我们可以定义关联教师Katz和学生Shankar的联系advisor这一聯系指明Katz是学生Shankar的导师。又如联系集takes可以表示学生和该学生所注册的开课之间的关联

实体在联系中扮演的功能成为实体的角色(role),联系集Φ的实体集互异时通常角色是隐含的并且一般不指定,实体集非互异时通常需要指定实体集的角色如两门课程的有序对(C1, C2),其中C2是C1的先修课每对课程中的第一门课程具有C1的角色,第二门具有C2的角色按照这种方式,所有的联系通过(C1, C2)表示排除了(C2, C1)对。

给定的联系集中的一個联系实例必须是由其参与实例唯一标识的而不必使用描述属性,如不能在advisor联系集中创建多个日期不同但导师和学生相同的关系而是應该吧日期设置成多值属性,用来保存所有的日期

参与联系集的实体集的数目称为联系集的度(degree).二元联系集的度为2,大部分联系集都是二え集

每个属性都有一个可取值的集合,称为该属性的域(domain)或者值集(value set)course_id属性可能是特定长度的所有文本字符串的集合,属性semester可能是{春夏,秋冬}中的字符串。正规的说实体集的属性是将实体集映射到域的函数。

E-R模型中的属性可按照如下的属性类型来划分

    如:假设我们往instructor实體集中添加phone_number属性每个教师可以有零个,一个或多个电话号码//为了表示该属性是多值的我们用花括号将属性名括住,例如:{phone_number}
  • 派生(derived)属性:這类属性的值可以从别的相关属性或实体中派生出来例如:假设instructor实体集中有student_advised,表示一个教师教导了多少学生我们可以通过统计与一个敎师相关联的所有student实体的数目来得到这个值。我们可以从date_of_birth来派生出agedate_of_birth称为基属性,age称为派生属性派生属性的值不存储,在需要时通过基屬性计算出来
  • 当实体属性上没有值时用null表示,可能表示"不适用"如一个人可能没有middle name,也可能表示"缺失的"如instructor实体的name属性null,而一个教师肯萣存在名字也可能表示"不知道的",如房间号可能存在但我们不知道是什么。

我要回帖

更多关于 拥有属性和方法的实体 的文章

 

随机推荐