在这一章节中,我们快速浏览一下如何创建一个简单的数据库、表和建立Model 之间的关系。

蚂蚁王国 :我们打算存储关于蚁群的数据。我们想要追踪和标记某个蚁群的所有蚂蚁和蚁后。

蚁群的关系是这样的:

蚁群(1:1) ——> 蚁后(1:多)——>蚂蚁

配置数据库

为了初始化DBFlow,建议将下面的代码放到Application 类里。

public class ExampleApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

FlowManager.init(this);

}

}

不要担心,这只是一个初始化的操作。即使你在其他Context(Activity…) 中初始化她,她也将只持有Application 的context。

最后,不要忘了把自己继承的Application放到manifest里

定义数据库

在DBFlow里,使用@Database 注解便会产生一个BaseDatabaseDefinition 的一个子类,只在这一个Object 里将连接所有的tables 、 ModelAdapter 、Views 、Queries 等等。

在这个例子里,我们需要定义我们存储我们蚂蚁群族的的数据库:

@Database(name = ColonyDatabase.NAME, version = ColonyDatabase.VERSION)

public class ColonyDatabase {

public static final String NAME = "Colonies";

public static final int VERSION = 1;

}

最好创建两个常量NAME 和VERSION,以便我们后面定义DBFlow的其他组件时引用它们。

Note: 如果你想要使用 SQLCipher 请阅读 setup here

创建我们的表并建立表关系

现在我们已经有了一个存储我们蚁群数据的数据库,我们还要明确我们的基础表如何存储,那么我们需要有一个能够体现基础数据的Model 。

蚁后表

我们将开始在蚁群里的探索咯!一个蚁群只可能有一个蚁后。我们使用对象关系映射来定义我们的数据对象。一个class 对应着一个表,我们可以标记class 的每一个字段代表我们数据表里的一列。在DBFlow,所有与数据库表进行关系映射的object 类,必须实现Model 类(原因大概是说基类里定义里一些操作数据的规则)。继承BaseModel 类就可以方便地建立一个标准的表啦。

正确地定义一个表的姿势:

1. 使用@Table 注解标记一个类。

2. 指出这个表所属的数据库。就像下面的ColonyDatabase 。

3. 至少定义一个主键。

4. 这个类和她所有的对应数据库列的字段必须是包级私有private 、public 或者private(对应要有getters和setters),以便DBFlow编译时生成这些类并使用它们。

我们可以把蚁后Queen 大概定义成这样:

@Table(database = ColonyDatabase.class)

public class Queen extends BaseModel {

@PrimaryKey(autoincrement = true)

long id;

@Column

String name;

}

那么我们有了蚁后的定义,现在我们需要为蚁后定义她的蚁群Colony:

@ModelContainer // more on this later.

@Table(database = ColonyDatabase.class)

public class Colony extends BaseModel {

@PrimaryKey(autoincrement = true)

long id;

@Column

String name;

}

现在我们有了一蚁后和蚁群表,我们要建立一个1:1映射的关系。我们想要这个数据库关注数据的删除,例如一个火灾发生了,烧掉了这个蚁群 Colony 。当Colony 被销毁了,我们认为蚁后也不存在了;如果我们”杀死“了这个蚁后那么她的蚁群也不再有了。

1:1 关系

为了建立这个关系,我们将定义这个节点的外键。蚁后Queen :

@ModelContainer

@Table(database = ColonyDatabase.class)

public class Queen extends BaseModel {

//...previous code here

@Column

@ForeignKey(saveForeignKeyModel = false)

Colony colony;

}

使用Model 作为外键,这样当从数据库里查询某列的某个值时,将可以自动加载这个关系。出于性能的考虑,我们默认把 savaForeignkeyModel=false ,这样当保存 Queen 对象时,将不会保存Colony . 如果你想保持这对值的变化影响,记得设置saveForeignkeyModel =true .

note:

在3.0版本中,我们不在需要明确给每个引用列定义@ForeignkeyReference ,DBFlow将基于@PrimaryKey 标记的引用表的类自动添加他们到表的定义里。 他们将以{foreignKeyFieldName}_{referencedColumnName} 的格式出现。(写好之后要rebuild project一下)

蚂蚁表和1:多

现在我们有了一个蚁群Colony 和属于它的蚁后Queen ,我们还需要一些蚂蚁类服侍蚁后。

@Table(database = ColonyDatabase.class)

public class Ant extends BaseModel {

@PrimaryKey(autoincrement = true)

long id;

@Column

String type;

@Column

boolean isMale;

@ForeignKey(saveForeignKeyModel = false)

ForeignKeyContainer queenForeignKeyContainer;

/** * Example of setting the model for the queen. */

public void associateQueen(Queen queen) {

queenForeignKeyContainer = FlowManager.getContainerAdapter(Queen.class).toForeignKeyContainer(queen);

}

}

我们定义了type 字段,它可能是干活的蚂蚁、产卵的蚂蚁或者其他。也定义了isMale 字段表示是男的还是女的。

在这个例子里,因为可能有很多很多蚂蚁,所以我们使用了 ForeignkeyContainer 。出于性能的考虑,这样可以延迟加载与其关联的 Queen ,当我们调用toModel 对Queen进行数据库查询时才会执行加载。基于这个原因,为了给ForeignKeyContainer 设置合适的值,你应该凭借 FlowManager.getContainerAdapter(Queen.class).toForeignKeyContainer(queen) 。调用它生成的方法并转换它到ForeignnKeyContainer 里。

因为ModelContainer 默认是不会产生的,为了使用ForeignKeyContainer我们必须添加注解到Queen 类。

最后,使用@ForeignKeyContainer 可以避免循环的引用。如果Queen 和Colony 都使用Model 进行里关联引用,那我们将内存泄漏了,因为他们都在尝试从数据库里加载对方。

接着,我们通过延迟加载这些蚂蚁的方式建立1:多的关系,因为我们有几千只,不,也可能是几百万只蚂蚁要储存。

@ModelContainer

@Table(database = ColonyDatabase.class)

public class Queen extends BaseModel {

//...

// needs to be accessible for DELETE

List ants;

@OneToMany(methods = {OneToMany.Method.SAVE, OneToMany.Method.DELETE}, variableName = "ants")

public List getMyAnts() {

if (ants == null || ants.isEmpty()) {

ants = SQLite.select()

.from(Ant.class)

.where(Ant_Table.queenForeignKeyContainer_id.eq(id))

.queryList();

}

return ants;

}

}

如果你不希望延迟加载你建立的关系,指定用OneToMany.Method.DELETE 和SAVE 来代替ALL 。如果Queen 的数据什么时光变化,你都不希望保存他们,那么你只要使用DELETE and LOAD 来替换下。

NOTE:为啥翻译这个说明文呢?

1. 项目里打算使用DBFlow。

2. 做开发快两年了,也打算写博客总结一下,写试试是什么个套路。

3. Markdown语法不熟,练练手。

4. 温习一下英语啦。

明天接着搞喽!

android dbflow引起内存泄漏,DBFlow使用说明(1)快速入门相关推荐

  1. Android常见的内存泄漏分析

    内存泄漏原因 当应用不需要在使用某个对象时候,忘记释放为其分配的内存,导致该对象仍然保持被引用状态(当对象拥有强引用,GC无法回收),从而导致内存泄漏. 常见的内存泄漏源头 泄漏的源头有很多,有开源的 ...

  2. 关于Android应用程序内存泄漏 你需要知道的一切

    关于Android应用程序内存泄漏 你需要知道的一切 原文:https://blog.aritraroy.in/everything-you-need-to-know-about-memory-lea ...

  3. Android中的内存泄漏

    ** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...

  4. 谈谈android中的内存泄漏

    写在前面 内存泄漏实际上很多时候,对于开发者来说不容易引起重视.因为相对于crash来说,android中一两个地方发生内存泄漏的时候,对于整体没有特别严重的影响.但是我想说的是,当内存泄漏多的时候, ...

  5. Android开源框架——内存泄漏检测工具 LeakCanary

    开源地址:https://github.com/square/leakcanary FAQ : https://github.com/square/leakcanary/wiki/FAQ 配置 bui ...

  6. 基于Android Studio的内存泄漏检测与解决全攻略

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

  7. Android性能优化——内存泄漏优化

    内存泄漏的优化分为两个方面 一方面:开发过程中避免写出有内存泄漏的代码 . 另一方面:通过一些分析工具比如MAT来找出潜在的内存泄露从而解决 场景1:静态变量导致的内存泄漏 场景2:单例模式导致的内存 ...

  8. 使用Android Studio 查看内存泄漏

    用新版的AS 的profiler 查看内存泄漏 记录一下使用Android Studio 的profiler 查看内存泄漏的过程.新版的AS 的profiler 功`能强大.我们可以很方便的查看到一个 ...

  9. Android Others部分内存泄漏 OOM分析

    本周公司项目解决内存泄漏,使用Android studio profiler工具进行分析. 在人工monkey测试点击管理页面各项菜单后,工具内存查看页面看到内存有增长不是释放的情况.但是dump后未 ...

最新文章

  1. 比特币现金可能成为市值第四大最大的加密货币
  2. ROS机器人程序设计(原书第2版)3.4 设置动态参数
  3. C++ 面向对象(二)—— 操作符重载
  4. 人工智能如何有效地运用于自然语言处理
  5. stimulsoft入门教程:分层报表(下)
  6. 毁掉孩子自信的10个杀手
  7. 超快速的端到端实例分割模型,手把手教你用opencv部署Yolact
  8. 汽车故障诊断技术【6】
  9. 基于MATLAB的有源三相滤波器的设计,基于MATLAB的有源滤波器的设计与仿真
  10. GitHub桌面版 Github Desktop 下载
  11. Java——自定义图片和居中
  12. uniapp导入高德地图三维模型实现webview和页面通讯
  13. 什么是UL2809认证?
  14. 杭电2154-跳舞毯
  15. Raspberry Pi 上手准备
  16. 计算机网络基础实验报告--利用数据包嗅探器Wireshark捕获数据包实验
  17. matlab之向数据点添加文本说明函数text
  18. 史上最全的Linux命令汇总(全网最全)
  19. 正则表达式-贪婪匹配与懒惰匹配之获取短信验证码
  20. Javaweb 聊天室

热门文章

  1. 开发也可以改变下,RxSwift-让你的开发变得简洁高效。
  2. BCryptPasswordEncoder密码加密器
  3. Boost.Asio 技术文档
  4. Unity中Terrain中刷出的树木模糊解决办法
  5. php批量添加图片,PHP批量上传图片的具体实现方法介绍._PHP教程
  6. 学术必备的21个论文网站,建议收藏!
  7. 2005年毕业论文----J2ME手机游戏开发高计
  8. 切条机切带机中达优控定长送料触摸屏一体机程序 超声切带和热切都可以通用
  9. ykhmi是什么触摸屏软件_深圳市人机界面寸触摸屏厂家
  10. 工业组态图标库,可直接在组态王,博图,威纶通触摸屏