GreenDao3学习

可以看看这个详细博客GreenDao3使用教程
这里借用一下ppjun的GreenDao demo来学习
androidManifest.xml添加读写权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

根目录下build.gradle添加

dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0
    }

在app/build.gradle目录下设置

apply plugin: 'org.greenrobot.greendao'
android {
   greendao{
        schemaVersion 1                    //数据库 版本号
        targetGenDir 'src/main/java'    //生成DaoMaster类文件夹
        daoPackage   'com.ppjun.greendaotest.db'  //生成DaoMaster类包名
    }

}
dependencies {
    compile 'org.greenrobot:greendao:3.1.0'
}

新建一个User类

@Entity
public class User {
    @Id
    private Long id;
    @Property(nameInDb = "username")
    private String userName;
    @Property(nameInDb = "password")
    private String passWord;
//get和set方法稍后生成
   @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }

其中 注释
@Entity 代表数据库里面的USER表
@Id 主键
@Property 表里面的内容
@Unique 唯一的
@Transient 不会被数据库持久化写进数据库
@NotNull 不为空
然后点击make Project或者sync一下,GreenDao就会为你生成get /set方法,以及一个db包,里面含有3个自动生成的数据库类:
在这里插入图片描述
然后就可以玩GreenDao3啦
数据库初始化方法放在这里:
GreenDaoUtils.java

 /*
 **初始化数据库
 */

public class GreenDaoUtils {
    public static final String DB_NAME = "ppjun.db";//给数据库起个名字

    public static GreenDaoUtils mInstance = new GreenDaoUtils();

    public static GreenDaoUtils getInstance() {
        return mInstance;
    }

    //第一次发布app不需要升级数据库正常使用DevOpenHelper获取daosession
    public DaoSession getSession(Context context) {
        DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
        DaoMaster daoMaster = new DaoMaster(helper.getWritableDb());
        return daoMaster.newSession();
    }

    //再次app需要升级数据库时 获取daosession,这样子升级数据库就不会丢失原来的数据了
    public DaoSession getUpdateSession(Context context) {
        DBHelper dbHelper = new DBHelper(context);
        DaoMaster daoMaster = new DaoMaster(dbHelper.getWritableDb());
        return daoMaster.newSession();
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    public static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取实例初始化数据库
        DaoSession daoSession = GreenDaoUtils.getInstance().getSession(getApplicationContext());
        //获取user表对象
        UserDao userDao = daoSession.getUserDao();//获取UserDao实例来对表user进行操作

        //add,增添/插入数据库,这里的null 代表自增长的id,你还可以为user表插入unique的userid
        User user1 = new User(null, "ag1", "123456");
        User user2 = new User(null, "ag2", "123456");
        User user3 = new User(null, "ag3", "123456");
        userDao.insert(user1);//插入
        userDao.insert(user2);
        userDao.insert(user3);


        //update 更新数据库  这里更新id是3的user的名字,id从1开始的,在where来添加匹配条件
        User user4 = userDao.queryBuilder().where(UserDao.Properties.Id.eq(3)).build().unique();
        user4.setUserName("ck");
        userDao.update(user4);

        //delete  这里删除id是2的user
        List<User> userList2 = userDao.queryBuilder().where(UserDao.Properties.Id.eq(2)).build().list();
        for (User user5 : userList2)
            userDao.delete(user5);



        //query 查询user表全部user
        List<User> userList = userDao.queryBuilder().build().list();
        for (User user : userList)
            Log.e(TAG,"user===="+user.toString());
    }
}

下面来说GreenDao的升级数据库,在user表插入age

1、修改build.gradle下面的schemaVersion 2,也就是版本号加1

2、在user类,新增age对象

public class User {
    @Id
    private Long id;
    @Property(nameInDb = "age")
    private int age;
  //generate getter and setter & toString
}

3、你要新建一个类DBHelper继承DaoMaster.OpenHelper,在类的构造函数传入Context,super(context,DB_NAME,null);还要重写onUpgrade方法(注意这里的参数一是Database),然后创建表(传入true,这里使用IF NOT EXISTS)不用担心表不存在,还有执行增加age列sql语句 db.exeSQL(“ALTER TABLE USER ADD COLUMN age”);
DBHelper.java

public class DBHelper extends DaoMaster.OpenHelper {

  public DBHelper(Context context) {
        super(context, DB_NAME,null);
    }

    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        super.onUpgrade(db, oldVersion, newVersion);
        UserDao.createTable(db,true);
        db.execSQL("ALTER TABLE NOTE ADD COLUMN age");
    }

}

这时候的DaoMaster.DevOpenHelper改为自定义DBHelper,这样子升级数据库就不会丢失原来的数据了,方法写在了GreenDaoUtils.java内

//再次app需要升级数据库时 获取daosession,这样子升级数据库就不会丢失原来的数据了
    public DaoSession getUpdateSession(Context context) {
        DBHelper dbHelper = new DBHelper(context);
        DaoMaster daoMaster = new DaoMaster(dbHelper.getWritableDb());
        return daoMaster.newSession();
    }

注意的坑

自增的id的类型必须是Long,而不能是long,否则不会自增。

@Id(autoincrement = true) 
    private Long id;

(autoincrement = true) 代表该字段是自增的

实体类中不能有任何注释,否则编译的时候你会发现不通过,相应的DaoMaster、DaoSession、VoltageEntityDao编译的时候不会重新生成,这时候有可能是因为你在实体里面加了注释,这时候可以尝试把注释去掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值