美文网首页
GreenDao的学习使用

GreenDao的学习使用

作者: JuSong | 来源:发表于2017-02-25 15:38 被阅读0次

    GreenDao:

    greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。

    官网地址:http://greenrobot.org/greendao/

    greenDAO 优势

    1、一个精简的库

    2、性能最大化

    3、内存开销最小化

    4、易于使用的 APIs

    5、对 Android 进行高度优化

    GreenDao 使用

    1 配置gradle相关:

    compile 'org.greenrobot:greendao:3.2.0'

    2在build.gradle中进行配置:

    dependencies {
    classpath 'com.android.tools.build:gradle:2.2.0'
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
    }

    3,自定义路径

    greendao{
    schemaVersion 1
    daoPackage 'com.greendao.song.greendao'
    targetGenDir 'src/main/java'
    }

    schemaVersion--> 指定数据库schema版本号,迁移等操作会用到;
    daoPackage --> dao的包名,包名默认是entity所在的包;
    targetGenDir --> 生成数据库文件的目录;

    主要代码

    创建一个Bean文件

    实体注解:

    @Entity(
    // 如果你有超过一个的数据库结构,可以通过这个字段来区分
    // 该实体属于哪个结构
    schema = "myschema",

    // 实体是否激活的标志,激活的实体有更新,删除和刷新的方法
    active = true,

    // 确定数据库中表的名称
    // 表名称默认是实体类的名称
    nameInDb = "AWESOME_USERS",

    // Define indexes spanning multiple columns here.
    indexes = {
    @Index(value = "name DESC", unique = true)
    },

    // DAO是否应该创建数据库表的标志(默认为true)
    // 如果你有多对一的表,将这个字段设置为false
    // 或者你已经在GreenDAO之外创建了表,也将其置为false
    createInDb = false
    )
    public class User {
    ...
    }

    基础注解:

    @Entity
    public classUser {
    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "USERNAME")
    private String name;

    @NotNull
    private int repos;

    @Transient
    private int tempUsageCount;

    ...
    }

    1.实体@Entity注解

    schema:告知GreenDao当前实体属于哪个schema
    active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
    nameInDb:在数据中使用的别名,默认使用的是实体的类名
    indexes:定义索引,可以跨越多个列
    createInDb:标记创建数据库表

    2.基础属性注解

    @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
    @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
    @NotNul:设置数据库表当前列不能为空
    @Transient :添加次标记之后不会生成数据库表的列

    3.索引注解

    @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    @Unique:向数据库列添加了一个唯一的约束

    4.关系注解

    @ToOne:定义与另一个实体(一个实体对象)的关系
    @ToMany:定义与多个实体对象的关系

    编译项目,User实体类会自动编译,生成get、set方法并且会在com.greendao.gen目录下生成三个文件,DaoMaster 、DaoSession、Dao类;

    编写帮助类


    public class GreenDaoHelper {
    private static DaoMaster.DevOpenHelper mHelper;
    private static SQLiteDatabase db;
    private static DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;

    /**
    * 初始化greenDao,这个操作建议在Application初始化的时候添加;
    */
    public static void initDatabase() {
    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    mHelper = new DaoMaster.DevOpenHelper(MyApplication.context, "cache-db", null);
    db = mHelper.getWritableDatabase();
    // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
    mDaoMaster = new DaoMaster(db);
    mDaoSession = mDaoMaster.newSession();
    }
    public static DaoSession getDaoSession() {
    return mDaoSession;
    }
    public static SQLiteDatabase getDb() {
    return db;
    }

    }

    增删改查

    首先获取UserDao对象:

    mUserDao = GreenDaoHelper.getDaoSession().getUserDao();
    

    数据库的增删改查我们都将通过UserDao来进行,插入操作如下:

    mUser = new User((long)1,"张三");
    mUserDao.insert(mUser);//添加一个
    

    User的第一个参数为id,如果这里传null的话在插入的过程中id字段会自动增长(现在知道为什么id要为Long类型了吧!)

    删除数据和修改数据的思路一样,都是要先查找到数据:

    List<User> userList = (List<User>) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(10)).build().list();  
            for (User user : userList) {  
                mUserDao.delete(user);  
            }  
    

    where表示查询条件,这里我是查询id小于等于10的数据,where中的参数可以有多个,就是说可以添加多个查询条件。最后的list表示查询结果是一个List集合,如果你只想查询一条数据,最后unique即可。当然,我们也可以根据id来删除数据:

    User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(16)).build().unique();  
            if (user == null) {  
                Toast.makeText(MainActivity.this, "用户不存在", Toast.LENGTH_SHORT).show();  
            }else{  
                mUserDao.deleteByKey(user.getId());  
            }  
    

    根据主键删除

    mUserDao.deleteByKey(id);
    

    删除所有数据

    mUserDao.deleteAll();
    

    根据ID修改数据

    mUser = new User((long)2,"anye0803");
    mUserDao.update(mUser);
    

    查询全部数据

    List<User> users = mUserDao.loadAll();    
    

    查询一条数据

    User user = mUserDao.queryBuilder().where(UserDao.Properties.name.eq("张三")).unique();

    数据库升级

    1.修改gradle文件

    首先在module的gradle文件中修改版本号:

    //这里改为最新的版本号  
    schemaVersion 2  

    2.修改实体类

    @Entity  
    public class User {
    @Property
    private int age;
    @Property
    private String password;
    @Id
    private Long id;
    @Property(nameInDb = "USERNAME")
    private String username;
    @Property(nameInDb = "NICKNAME")
    private String nickname;
    }

    重现编译项目运行即可。

    一般的数据库升级这样就可以了,特殊情况可能需要自己编写数据库迁移脚本,这种时候可以自定义UpgradeHelper

    public class UpgradeHelper extends DaoMaster.DevOpenHelper {

    public static String TAG = UpgradeHelper.class.getSimpleName();

    public UpgradeHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
    super(context, name, factory);
    }

    /**
    * Here is where the calls to upgrade are executed
    * onUpgrade方法中进行数据库的迁移
    */
    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {

    /* i represent the version where the user is now and the class named with this number implies that is upgrading from i to
    i++ schema */
    for (int i = oldVersion; i < newVersion; i++) {
    Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by migrating all tables data");
    // TODO: 注意把所新版本的表的xxDao都添加到这里
    MigrationHelper.getInstance().migrate(db, UserDao.class);
    }
    }
    }

    相关文章

      网友评论

          本文标题:GreenDao的学习使用

          本文链接:https://www.haomeiwen.com/subject/jjzgwttx.html