引言

总所周知,SQLite——内嵌于Android中一个占用内存极小的关系型,作为我们Android存储领域中重要的一员 ,或多或少都曾接触到数据库。即使Android系统中提供了很多操作SQLite的API,可是在业务开发中还是须要手动去编写原生SQL语句,这不仅复杂、不好维护。更重要的是不高效,经常会由于SQL语句写错而添加了开发成本,于是便出现了ORM(对象关系映射)框架。简化了编写SQL语句的开发工作。当中比較著名的有GreenDao、OrmLite、Litepal等。

一、greenDAO 3概述

greenDAO 3是基于注解来定义 schemasentities,而greenDAO 3之前的版本号则要求开发者有一个单独的生成器Java项目来定义的。



如上图所看到的,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且高速的 ORM 解决方式。

(greenDAO is a light & fast ORM solution that maps objects to SQLite databases.)它性能最大化,可能是Android平台上最快的ORM框架 易于使用的API 最小的内存开销 依赖体积小 支持数据库加密 强大的社区支持

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ3JhenlNb18=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

二、greenDAO的重大角色

D for Data。A for Access,O for Object(假设没理解错的话)。 所以最重要的三大主角肯肯定非:DAO**s、**DaoMasterDaoSession莫属,正所谓红花还需绿叶衬,除了三大主角还包括其它角色SchemaPropertiesEntity等共同完毕,接下来接单介绍下他们的功能和联系:

1、DAOs

DAOs是负责直接实现增删改查数据库的,直接映射着我们要操作的JeanBean,所以默认情况下命名为XxxDAO。简而言之,要想操作数据库,都得先通过DaoSession的getXxxDAO系方法获得相应的DAO,再调用相应的方法, DAOs里生成数据库语句, 将成员变量与表里的參数绑定相应起来, 而且在它的父类AbstractDao 里实现了相对DaoSession的操作数据的方法(也能够从DaoSession 父类的源代码里发现DaoSession 的那些方法本质上就是DAOs的封装),事实上仅仅需看看我们自己的DAO代码就可以猜到他的角色了。

  1. // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
  2. /**
  3. * DAO for table "USER".
  4. */
  5. public class UserDao extends AbstractDao<User, Long> {
  6. public static final String TABLENAME = "USER";
  7. /** Creates the underlying database table. */
  8. public static void createTable(Database db, boolean ifNotExists) {
  9. String constraint = ifNotExists? "IF NOT EXISTS ": "";
  10. db.execSQL("CREATE TABLE " + constraint + "\"USER\" (" + //
  11. "\"_id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ," + // 0: _id
  12. "\"NAME\" TEXT," + // 1: name
  13. "\"AVATAR_URL\" TEXT," + // 2: avatarUrl
  14. "\"IS_VERFYED\" INTEGER NOT NULL );"); // 3: isVerfyed
  15. }
  16. /** Drops the underlying database table. */
  17. public static void dropTable(Database db, boolean ifExists) {
  18. String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "\"USER\"";
  19. db.execSQL(sql);
  20. }
  21. @Override
  22. protected final void bindValues(DatabaseStatement stmt, User entity) {
  23. stmt.clearBindings();
  24. stmt.bindLong(1, entity.get_id());
  25. String name = entity.getName();
  26. if (name != null) {
  27. stmt.bindString(2, name);
  28. }
  29. String avatarUrl = entity.getAvatarUrl();
  30. if (avatarUrl != null) {
  31. stmt.bindString(3, avatarUrl);
  32. }
  33. stmt.bindLong(4, entity.getIsVerfyed() ? 1L: 0L);
  34. }
  35. @Override
  36. public User readEntity(Cursor cursor, int offset) {
  37. User entity = new User( //
  38. cursor.getLong(offset + 0), // _id
  39. cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // name
  40. cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // avatarUrl
  41. cursor.getShort(offset + 3) != 0 // isVerfyed
  42. );
  43. return entity;
  44. }
  45. ...
  46. }

2、DaoMaster

DaoMaster 它掌管着数据库对象(SQLiteDatabase) 而且它还管理全部的 DAO 和DAOSession。首先通过AbstractDaoMaster的registerDaoClass方法创建DaoConfig对象。注冊一个实体类,并加入到DAOMaster的daoConfigMap对象中,以Map的形式保存信息。表示该实体类须要持久化,待为其创建数据表。详细的过程与原生的有所不同,使用过SQLite 原生SQL方式的。应该都知道在Android系统中为了便于对SQLiteDatabase做数据库操作提供了SQLiteOpenHelper类。它里面有两个抽象方法各自是onCreate()和onUpdate()分别在数据库第一次建立和升级的时候被调用。而greenDAO则是在DAOMaster中加入了OpenHelper继承了DatabaseOpenHelper(当中DatabaseOpenHelper继承了SQLiteOpenHelper),并在onCreate()方法中调用createAllTables(db, false)创建全部的数据表。而DevOpenHelper则继续继承OpenHelper并在onUpdate()在方法中删除全部数据表并又一次创建,createAllTables和dropAllTables方法比較简单,仅仅是简单地调动DAOs的数据表创建和删除方法。

最后。再通过newSession系列方法初始化DaoSession

  1. // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
  2. /**
  3. * Master of DAO (schema version 1): knows all DAOs.
  4. */
  5. public class DaoMaster extends AbstractDaoMaster {
  6. public static final int SCHEMA_VERSION = 1;
  7. /** Creates underlying database table using DAOs. */
  8. public static void createAllTables(Database db, boolean ifNotExists) {
  9. UserDao.createTable(db, ifNotExists);
  10. }
  11. /** Drops underlying database table using DAOs. */
  12. public static void dropAllTables(Database db, boolean ifExists) {
  13. UserDao.dropTable(db, ifExists);
  14. }
  15. /**
  16. * WARNING: Drops all table on Upgrade! Use only during development.
  17. * Convenience method using a {@link DevOpenHelper}.
  18. */
  19. public static DaoSession newDevSession(Context context, String name) {
  20. Database db = new DevOpenHelper(context, name).getWritableDb();
  21. DaoMaster daoMaster = new DaoMaster(db);
  22. return daoMaster.newSession();
  23. }
  24. public DaoSession newSession(IdentityScopeType type) {
  25. return new DaoSession(db, type, daoConfigMap);
  26. }
  27. public DaoMaster(Database db) {
  28. super(db, SCHEMA_VERSION);
  29. registerDaoClass(UserDao.class);
  30. }
  31. /**
  32. * Calls {@link #createAllTables(Database, boolean)} in {@link #onCreate(Database)} -
  33. */
  34. public static abstract class OpenHelper extends DatabaseOpenHelper {
  35. public OpenHelper(Context context, String name) {
  36. super(context, name, SCHEMA_VERSION);
  37. }
  38. public OpenHelper(Context context, String name, CursorFactory factory) {
  39. super(context, name, factory, SCHEMA_VERSION);
  40. }
  41. @Override
  42. public void onCreate(Database db) {
  43. Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
  44. createAllTables(db, false);
  45. }
  46. }
  47. /** WARNING: Drops all table on Upgrade! Use only during development. */
  48. public static class DevOpenHelper extends OpenHelper {
  49. public DevOpenHelper(Context context, String name) {
  50. super(context, name);
  51. }
  52. public DevOpenHelper(Context context, String name, CursorFactory factory) {
  53. super(context, name, factory);
  54. }
  55. @Override
  56. public void onUpgrade(Database db, int oldVersion, int newVersion) {
  57. Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
  58. dropAllTables(db, true);
  59. onCreate(db);
  60. }
  61. }
  62. ...
  63. }

3、DaoSession

DaoSession 管理着全部的DAO 对象主要用于提供获取DAOs的接口,每个DaoMaster持有一个数据库连接。通过DaoMaster的newSession()方法能够实例化多个Session,这些Session相应同一个数据库连接,可是系统会为每个Session分配内存,在这片内存中会为实体进行缓存。

每个Session相应一个Identity scope。一个新的Session就代表一个会话,通过同一个会话中的DAOs进行的数据库操作。greenDAO会对其优化,比如查询操作会对结果缓存之类的机制等等。

  1. public class AbstractDaoSession {
  2. private final Database db;
  3. private final Map<Class<?
  4. >, AbstractDao<?, ?>> entityToDao;
  5. public AbstractDaoSession(Database db) {
  6. this.db = db;
  7. this.entityToDao = new HashMap<Class<?>, AbstractDao<?, ?>>();
  8. }
  9. protected <T> void registerDao(Class<T> entityClass, AbstractDao<T, ?
  10. > dao) {
  11. entityToDao.put(entityClass, dao);
  12. }
  13. /** Convenient call for {@link AbstractDao#queryRaw(String, String...)}. */
  14. public <T, K> List<T> queryRaw(Class<T> entityClass, String where, String... selectionArgs) {
  15. @SuppressWarnings("unchecked")
  16. AbstractDao<T, K> dao = (AbstractDao<T, K>) getDao(entityClass);
  17. return dao.queryRaw(where, selectionArgs);
  18. }
  19. /** Convenient call for {@link AbstractDao#queryBuilder()}. */
  20. public <T> QueryBuilder<T> queryBuilder(Class<T> entityClass) {
  21. @SuppressWarnings("unchecked")
  22. AbstractDao<T, ?
  23. > dao = (AbstractDao<T, ?
  24. >) getDao(entityClass);
  25. return dao.queryBuilder();
  26. }
  27. public AbstractDao<?, ?> getDao(Class<? extends Object> entityClass) {
  28. AbstractDao<?, ?
  29. > dao = entityToDao.get(entityClass);
  30. if (dao == null) {
  31. throw new DaoException("No DAO registered for " + entityClass);
  32. }
  33. return dao;
  34. }
  35. ...
  36. }

4、Entity

Entity本质上就是加入了@Entity注解的JavaBean。而且与数据库相应的表建立了映射关系

5、Properties

Properties是DAOs里的一个静态内部类,把Entity里的属性封装为Property对象。负责创建、删除实体相应的表。真正运行SQL语句,简而言之就是每个Property对象相应着Entity里第一个数据成员变量,同一时候也相应着数据表的的一个列元素。

  1. public class UserDao extends AbstractDao<User, Long> {
  2. public static final String TABLENAME = "USER";
  3. /**
  4. * Properties of entity User.<br/>
  5. * Can be used for QueryBuilder and for referencing column names.
  6. */
  7. public static class Properties {
  8. public final static Property _id = new Property(0, long.class, "_id", true, "_id");
  9. public final static Property Name = new Property(1, String.class, "name", false, "NAME");
  10. public final static Property AvatarUrl = new Property(2, String.class, "avatarUrl", false, "AVATAR_URL");
  11. public final static Property IsVerfyed = new Property(3, boolean.class, "isVerfyed", false, "IS_VERFYED");
  12. }
  13. ...
  14. }

6、Schema

Schema模式、架构的意思,事实上作用和SQL Server数据库里的大同小异。都是为了提升数据库自身的性能,从我们应用greenDAO方面来说,也能够不必深究,就拿SQL Server 2000来说。相应的对象命名是“server.数据库.username.对象”,但2000之后版本号的对象命名改为“server.数据库.Schema.对象”。这让规划数据库对象命名时更有弹性。 架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,当中每个元素的名称都是唯一的。

三、引入并配置greeDAO

1、在Project的build.gradle脚本下引入

必须配置:

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath 'com.android.tools.build:gradle:2.2.3'
  7. // NOTE: Do not place your application dependencies here; they belong
  8. // in the individual module build.gradle files
  9. }
  10. //加入greeDAO start
  11. repositories {
  12. mavenCentral()
  13. }
  14. dependencies {
  15. classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
  16. }
  17. //加入greeDAO end
  18. }

可选配置:

  1. //与
  2. allprojects {
  3. repositories {
  4. jcenter()
  5. // 使用数据库升级辅助GreenDaoUpgradeHelper时加入
  6. maven { url "https://jitpack.io" }
  7. }
  8. }

2、配置module下的build.gradle

必须配置:

apply plugin: ‘org.greenrobot.greendao’

  1. dependencies {
  2. compile fileTree(dir: 'libs', include: ['*.jar'])
  3. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  4. exclude group: 'com.android.support', module: 'support-annotations'
  5. })
  6. testCompile 'junit:junit:4.12'
  7. //greeDAO start
  8. compile 'org.greenrobot:greendao:3.2.0'
  9. // 数据库加密时加入
  10. compile 'net.zetetic:android-database-sqlcipher:3.5.1'
  11. // 使用数据库升级辅助GreenDaoUpgradeHelper时加入
  12. compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v1.2.0'
  13. //greeDAO end
  14. }

可选配置:

  1. //与dependencies平级。主要用于配置数据库相关信息的及自己主动生成的“DAO”资源的文件夹
  2. greendao {
  3. schemaVersion 1//数据库版本号号
  4. daoPackage 'crazymo.src.greendao'//设置DaoMaster、DaoSession、Dao包名
  5. targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao文件夹
  6. //targetGenDirTest:设置生成单元測试文件夹
  7. //generateTests:设置自己主动生成单元測试用例
  8. }

完毕以上配置工作之后,建立一个实体Bean,再点击build。则能够完毕DAO相关资源文件的建立。

四、使用greeDAO 3的步骤及基本术语

1、建立实体Entity

所谓实体,本质上它就是一个普通的JavaBean,特殊之处在于它被加入了greenDAO的@Entity注解来表达持久化的存储数据模型,与SQlite数据库中的表建立了映射关系,简单来说。一个JavaBean的实例相应数据库表记录中的一行。JavaBean中的数据成员变量相应着表中的列头值

  1. /**/
  2. public class User {
  3. private long _id;
  4. private String name;
  5. private String avatarUrl;
  6. private boolean isVerfyed;
  7. }

2、greeDAO 3 注解的基本的语法

greenDAO 3是支持多种注解的,能够分为:实体@Entity注解基本属性注解索引注解关系注解

  1. @Entity(
  2. // schema 名,多个 schema 时设置关联实体。
  3. 插件产生不支持,需使用产生器
  4. // schema = "myschema",
  5. // 标记一个实体是否处于活动状态。活动实体有 update、delete、refresh 方法。
  6. 默觉得 false
  7. active = false,
  8. // 表名,默觉得类名
  9. nameInDb = "AWESOME_USERS",
  10. // 定义多列索引
  11. indexes = {
  12. @Index(value = "name DESC", unique = true)
  13. },
  14. // 标记是否创建表。默认 true。多实体相应一个表或者表已创建,不须要 greenDAO 创建时设置 false
  15. createInDb = true,
  16. // 是否产生全部參数构造器。默觉得 true。无參构造器必定产生
  17. generateConstructors = true,
  18. // 假设没有 get/set 方法,是否生成。默觉得 true
  19. generateGettersSetters = true
  20. )
  21. public class User {
  22. // 主键。autoincrement设置自增
  23. @Id(autoincrement = true)
  24. private Long id;
  25. // 唯一。默认索引
  26. @Unique
  27. private Long userId;
  28. // 列名。默认使用变量名。
  29. 变化:customName --> CUSTOM_NAME
  30. @Property(nameInDb = "USERNAME")
  31. private String name;
  32. // 索引,unique设置唯一。name设置索引别名
  33. @Index(unique = true)
  34. private long fk_dogId;
  35. // 非空
  36. @NotNull
  37. private String horseName;
  38. // 忽略。不持久化,可用关键字transient替代
  39. @Transient
  40. private int tempUsageCount;
  41. // 对一,实体属性与外联实体中的ID相相应。默认自己主动自己主动生成。fk和对象联动,同一时候改变。对象懒载入
  42. @ToOne(joinProperty = "fk_dogId")
  43. private Dog dog;
  44. // 对多,referencedJoinProperty 指定实体中与外联实体属性相相应的外键
  45. @ToMany(referencedJoinProperty = "fk_userId")
  46. private List<cat> cats;
  47. // 对多,@JoinProperty注解:name 实体中的属性。referencedName 外联实体中的属性。
  48. @ToMany(joinProperties = {
  49. @JoinProperty(name = "horseName", referencedName = "name")
  50. })
  51. private List<horse> horses;
  52. // 对多,@JoinEntity注解:entity 中间表;sourceProperty 实体属性。targetProperty 外链实体属性
  53. @ToMany
  54. @JoinEntity(
  55. entity = JoinSheepToUser.class,
  56. sourceProperty = "uId",
  57. targetProperty = "sId"
  58. )
  59. private List<sheep> sheep;
  60. }
  61. @Entity
  62. public class JoinSheepToUser {
  63. @Id
  64. private Long id;
  65. private Long uId;
  66. private Long sId;
  67. }
  68. @Entity
  69. public class Sheep {
  70. @Id
  71. private Long id;
  72. private String name;
  73. }

2.1、实体@Entity注解

@Entity注解能够表明该类是须要持久化的类

  1. @Entity(
  2. // If you want to have more than one schema, you can tell greenDAO
  3. // to which schema an entity belongs (pick any string as a name).
  4. schema = "myschema",
  5. // Flag to make an entity "active": Active entities have update,
  6. // delete, and refresh methods.
  7. active = true,
  8. // Specifies the name of the table in the database.
  9. // By default, the name is based on the entities class name.
  10. nameInDb = "AWESOME_USERS",
  11. // Define indexes spanning multiple columns here.
  12. indexes = {
  13. @Index(value = "name DESC", unique = true)
  14. },
  15. // Flag if the DAO should create the database table (default is true).
  16. // Set this to false, if you have multiple entities mapping to one table,
  17. // or the table creation is done outside of greenDAO.
  18. createInDb = false
  19. )
  • schema:设置当前实体所属的schema

  • active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法。默认false

  • nameInDb:在数据库中使用的表名,默认使用的是实体的类名

  • indexes:定义索引。能够跨越多个列

  • createInDb:标记是否创建表,默认 true。

    当多实体相应一个表或者表已创建,或不须要 greenDAO 创建时设置 false

  • generateGettersSetters:,自己主动生成getter和setter默认true

  • generateConstructors:,自己主动生成构造方法,默认true

2.2、基本属性注解

  • @Id:主键 long 型,能够通过@Id(autoincrement = true)设置自增长

  • @Property:能够自己定义该属性在数据表的列名,默认是使用字段名,例:@Property(nameInDb = “name”)

  • @NotNull:设置数据库表当前列不能为空

  • @Transient:不正确该属性持久化,即加入此标记后不会在数据表中创建相应的列

2.3、索引注解

  • @Index:为一个属性来创建一个索引(即在这个属性相应的列名上创建索引),通过name设置索引别名。也能够通过unique给索引加入约束,有name和unique两个參数,name能够为索引指定名称。unique与数据表中建立索引的unique含义一致

  • @Unique:向数据库加入了一个唯一的约束

2.4、关系注解

在建立数据库时。每个实体类会建立一张数据表,代表一个关系,而不同实体之间必定存在一定的关系,反映到数据表上也须要建立关系。

2.4.1、@ToOne:定义与还有一个实体(一个实体对象)的关系1:1

比方说在我们数据库中存在User用户表和Avatar表分别负责存储用户信息和图片信息。每一条User信息都相应这一个头像的图片信息,非常明显User表和Avatar存在着1:1的关系(即所谓的外键)。就能够通过@ToOne(joinProperty = “avatarId”)来定义。那么终于在数据表中则会有 avatarId 这一列作为外键。与Picture数据表建立联系。假设你没有指定 avatarId , greenDAO也会在数据表中生成一列属性其作用与指定的avatarId同样,代码例如以下:

  1. @Entity
  2. public class User {
  3. @Id
  4. private Long id;
  5. private String name;
  6. private Long avatarId;//
  7. @ToOne(joinProperty = "avatarId")
  8. private Avatar Avatar;
  9. ....
  10. }
  11. @Entity
  12. public class Avatar {
  13. @Id
  14. private long avatarId;
  15. ...
  16. }

2.4.2、 @ToMany:定义与多个实体对象的关系1:N

一对多的关系,定义了一个实体对象相应着多个实体对象,比方一个用户相应多个Order, 在建立数据表示会在目标实体(即一对多的那个多的实体类)的数据表中建立外键,指向源实体类(一对多中的一那个实体类)的数据表。

目标数据表中的外键属性由@ToMany(referencedJoinProperty = “XXXX”)指定。终于在代码中能够使用User#getOrders()获取user的全部相应的order的List, ownerId是在Order中的外键。指向User的主键Id。

  1. @Entity
  2. public class User {
  3. @Id
  4. private Long id;
  5. private String name;
  6. private Long avatarId;
  7. @ToOne(joinProperty = "avatarId")
  8. private Avatar avatar;
  9. @ToOne
  10. private Avatar thumbnailPicture;
  11. @ToMany(referencedJoinProperty = "ownerId")
  12. private List<Order> oders;
  13. ...
  14. }
  15. @Entity
  16. public class Order {
  17. @Id
  18. private long id;
  19. private long ownerId;
  20. ...
  21. }

2.4.3、joinProperties为指定属性设置关系

较为复杂的关系能够使用joinProperties属性。其值能够设置一系列的@JoinProperty(name = “XXXX”, referencedName = “YYYY”),能够建立目标实体类中YYYY属性指向源实体类XXXX的属性。当中YYYY为非空,XXXX为unique的。不一定是主键,这种关系能够有多个,引用官方样例

  1. @Entity
  2. public class User {
  3. @Id private Long id;
  4. @Unique private String authorTag;
  5. @ToMany(joinProperties = {
  6. @JoinProperty(name = "authorTag", referencedName = "ownerTag")
  7. })
  8. private List<Site> ownedSites;
  9. }
  10. @Entity
  11. public class Site {
  12. @Id private Long id;
  13. @NotNull private String ownerTag;
  14. }

3、为实体JavaBean加入上相应的注解

  1. /*指定该Bean为greeDAO的实体*/
  2. @Entity
  3. public class User {
  4. @Id(autoincrement = true)//定义_id为主键而且自增
  5. @NotNull //定义不为空约束
  6. private long _id;
  7. private String name;
  8. private String avatarUrl;
  9. private boolean isVerfyed;
  10. }

4、初始化greenDAO并创建数据库

一般建议在Application中初始化数据库(下面这种方式有非常大的优化空间),直接使用SQlite的时候我们通过SQLiteOpenHelper的子类来获取DB对象,而greenDAO也相似。我们通过他的DevOpenHelper来获取。

  1. //name:数据库的名字;cursorFactory:游标工厂,一般不用,传入null或者使用两个參数的方法就可以
  2. DevOpenHelper(Context context,String name)
  3. DevOpenHelper(Context context,String name,CursorFactory factory)
  1. public class GreenDAOApplication extends Application {
  2. private final static String DBNAME="REBOT_DB" ;
  3. public static DaoSession daoSession=null;
  4. @Override
  5. public void onCreate() {
  6. super.onCreate();
  7. initGreenDAO(this);
  8. }
  9. /**
  10. * 初始化并创建数据库及其结构
  11. */
  12. private void initGreenDAO(Context context){
  13. DaoMaster.DevOpenHelper openHelper=new DaoMaster.DevOpenHelper(context,DBNAME);
  14. Database database=openHelper.getWritableDb();
  15. DaoMaster daoMaster=new DaoMaster(database);
  16. daoSession=daoMaster.newSession();
  17. }
  18. public static DaoSession getDaoSession(){
  19. return daoSession;
  20. }
  21. }

以上为入门greenDAO所应该掌握的全部知识,仅仅要建立的Entity之后,Build之后数据库中就已经创建好了数据表。此时Entity就不宜再改动字段了,下一篇再进入实战操作。

Android ORM——初识greenDAO 3及使用greenDAO 3前应该掌握的一些知识点(一)的更多相关文章

  1. ORM对象关系映射之使用GreenDAO进行CRUD操作

    在Android中,我们都知道使用的数据库是SQLite,而使用这种原生的数据库非常繁琐,它对表的管理和进行CRUD操作都需要我们写sql语句,在进行多表关联的操作上,更是需要写一堆sql,而且维护起 ...

  2. 最好的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  3. 推荐的Android ORM框架

    1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...

  4. 最受欢迎的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  5. Android ORM SQL Top 5

    If you are developing an Android application, you will likely need to store data somewhere. You may ...

  6. Android ORM应用开发框架KJFrameForAndroid使用详解

    本文将为大家介绍一款Android ORM应用开发框架KJFrameForAndroid,很多时候我们也叫它KJLibrary. KJFrameForAndroid简介 KJFrameForAndro ...

  7. 简单实用的Android ORM框架TigerDB

    TigerDB是一个简单的Android ORM框架,它能让你一句话实现数据库的增删改查,同时支持实体对象的持久化和自动映射,同时你也不必关心表结构的变化,因为它会自动检测新增字段来更新你的表结构. ...

  8. 【重走Android之路】【番外篇】有关于null的一些知识点

    [重走Android之路][番外篇]有关于null的一些知识点   1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...

  9. Android ORM 框架之 greenDAO 使用心得

    前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM  ...

随机推荐

  1. JS判断浏览器类型和详细区分IE各版本浏览器

    今天用到JS判断浏览器类型,于是就系统整理了一下,便于后期使用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  2. Redis(六)-数据类型

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) string是redis最 ...

  3. IP地址库

    吐槽 前两天一个线上的IP地址库除了点幺蛾子,一查代码,发现用的库早就不更新了,遂决定换库,有几个方案: 纯真数据库 IPIP数据库 GeoIP 纯真数据库是大码农的福音,免费,但是精度一般:IPIP ...

  4. RabbitMQ .NET消息队列使用入门(二)【多个队列间消息传输】

    孤独将会是人生中遇见的最大困难. 实体类: DocumentType.cs public enum DocumentType { //日志 Journal = 1, //论文 Thesis = 2, ...

  5. # Nginx常见问题

    try_files的使用 按顺序检查文件是否 存在 location /{ try_files $uri $uri/ /index.php } 解析:在/下寻找$uri,如果没有找到,则去找$uri/ ...

  6. 全文检索引擎及工具 Lucene Solr

    全文检索引擎及工具 lucence lucence是一个全文检索引擎. lucence代码级别的使用步骤大致如下: 创建文档(org.apache.lucene.document.Document), ...

  7. 【转载】linux环境下大数据网站搬家

    这里说的大数据是指你的网站数据库大小至少超过了500M,当然只有50M的网站也同样可以用这样的方法来轻松安全的实现网站搬家,前提是你使用的是linux环境下的VPS或者独立服务器. 我们假设你的网站域 ...

  8. 实现Android-JNI本地C++调试

    1.       原文链接:NDK单步调试方法 如有问题或者版权要求,请拜访原作者或者通知本人. 最近为了性能需求,开始搞JNI,白手起搞真心不容易.中间差点崩溃了好几次,最终总算得到一点心得. JN ...

  9. mysql 统计按天、星期、按月数据的各种 sql 语句 (转录)

    文章主要是作为知识整理,内容略有修改,方便以后查阅,内容转摘至 陈宇衡的个人博客,欢迎前去围观. 作为演示效果,先创建一个测试表,在插入两条数据(注:时间为 datetime 类型,unix 时间戳需 ...

  10. DB120连接TTL--OpenWRT

    DB120 TTL线连接 1.解压文件安装USB TTL PL2303HX 驱动 2.插上usb转ttl设备 3.串口调试 4.连接ttl线到db120 5.The END