您的位置:首页 > 数据库

GreenDao数据库简单配置和升级

2017-12-18 10:37 120 查看
项目中用到本地数据库存储数据,数据量以及类型比较多而且繁杂,一个Sp已经显得苍白无力了 - -!于是乎,就用GreenDao来存储了。

先说一下配置情况:

1、工程build.gradle中添加如下:



说明:dependencies节点下添加

classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'


2、Moudle下的build.gradle添加如下:



说明:顶部最外层添加:

apply plugin: 'org.greenrobot.greendao'


android节点下添加:

greendao {
schemaVersion 1//数据库版本号,数据库升级会用到,如果不需要升级,一直为1就好
daoPackage 'com.thtj.demo.dao'//DaoMaster、DaoSession以及各种实体Dao的生成路径
targetGenDir 'src/main/java'
}


dependencies节点下添加:

compile 'org.greenrobot:greendao:3.2.2'


最后Aysnc一下就算完成了。

3、创建实体类表,比如:

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Unique;
import org.greenrobot.greendao.annotation.Generated;

@Entity
public class Person {
@Id
private Long id;
@Unique
private String name;
private int age;
private String sex;
private int salary;
@Generated(hash = 72938267)
public Person(Long id, String name, int age, String sex, int salary) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
@Generated(hash = 1024547259)
public Person() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return this.sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getSalary() {
return this.salary;
}
public void setSalary(int salary) {
this.salary = salary;
}

}


声明完属性以后,rebuild一下工程,会自动生成上面的那些get、set等方法,对应的dao包路径下也会生成相应的Dao文件。这些都不需要手动添加,全是rebuild工程之后自动生成的,而且不建议修改。你只需要声明属性(也就是表中的字段)就好。

4、创建MyApplication:

public class MyApplication extends Application {
private MySQLiteOpenHelper mHelper;
public static MyApplication instance;

@Override
public void onCreate() {
super.onCreate();
instance = this;
setDatabase();
}

public static MyApplication getInstances() {
return instance;
}

private void setDatabase() {
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 在正式的项目中,还应该做一层封装,来实现数据库的安全升级。
mHelper = new MySQLiteOpenHelper(this, "notes-db", null);
}

public DaoSession getDaoSession() {
return new DaoMaster(mHelper.getWritableDatabase()).newSession();
}
}


里面有这么一句话:“在正式的项目中,还应该做一层封装,来实现数据库的安全升级”。网上的很多Demo是未封装的。如果你的数据库不需要升级的话,可以直接使用,但是如果你的数据库需要升级的话,显然就不可取了。

因为数据库版本升级的话,会默认先删除所有的表,再重新创建,意味着如果用户之前数据库里已经保存了数据,你这样不作处理,直接修改为schemaVersion2然后打包给用户安装的话,会导致用户之前手机数据库里存的数据全部丢失。下面DaoMater里那两行代码也意味着:删除、重建。



所以在升级的时候需要对用户已经保存的数据进行一下处理。

借助于:

compile 'com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.0.1'


工程build.gradle中allprojects节点下的repositories下添加

maven { url "https://jitpack.io" }


github上搜一下就行,当然网上也有很多使用教程。

compile完成之后,创建一个MySQLiteOpenHelper,也就是上面MyApplication中用到的。

public class MySQLiteOpenHelper extends DaoMaster.OpenHelper {
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
MigrationHelper.migrate(db, new MigrationHelper.ReCreateAllTableListener() {
@Override
public void onCreateAllTables(Database db, boolean ifNotExists) {
DaoMaster.createAllTables(db, ifNotExists);
}
@Override
public void onDropAllTables(Database db, boolean ifExists) {
DaoMaster.dropAllTables(db, ifExists);
}
}, PersonDao.class);
}
}


重写了升级里面的方法,这样就保证了即使数据库添加字段升级了,数据也不会丢失。

上面的PersonDao就是Person这个表新增字段有改动的dao,可以添加多个,比如:

PersonDao.class,MoneyDao.class...


然后就可以使用了,Demo如下:

public class MainActivity extends Activity {
private TextView tv;
private String s = "";
private PersonDao dao = MyApplication.getInstances().getDaoSession().getPersonDao();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);

List<Person> personList = dao.loadAll();
if (personList.size() == 0) {
for (int i = 0; i < 2; i++) {
Person p = new Person();
p.setName("挨踢" + i);
p.setAge(i);
p.setSex("男");
dao.insertOrReplace(p);
}
queryData();
} else {
queryData();
}
tv.setText(s.substring(0, s.length() - 1));

tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Person p = dao.queryBuilder()
.where(PersonDao.Properties.Name.eq("挨踢0")).unique();
if (p != null) {
p.setSex("女");
dao.insertOrReplace(p);
//                    dao.update(p);//也可以这样,检测到存在都会更新
}
queryData();
tv.setText(s.substring(0, s.length() - 1));
}
});
}

public void queryData(){
s = "";
List<Person> pl = dao.loadAll();
if (pl != null && pl.size() > 0) {
for (Person p : pl) {
s += new GsonBuilder().serializeNulls().create().toJson(p) + ",";
}
}
}
}


插入一条数据常用方法:insert或者insertOrReplace,后者也起到了更新的功能,跟update功能一样,只不过在数据库里的顺序会改变,直接update更新的话,顺序不会改变。关于查询和删除的方法就不多说了,网上很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐