app的依赖文件里添加依赖:
compile 'org.greenrobot:greendao:3.2.2'
在最外层的build.gradle里添加插件依赖
// In your root build.gradle file:
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
在app的build.gradle里应用plguin:
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
添加数据库版本
在app的build.gradle里加上schemaVersion
android {
//android的配置
}
//加在android标签下面,同一个层级
greendao {
schemaVersion 1
// daoPackage "com.example.model" // set package of generated classes
}
每次修改了表结构,可以将version加一,升级数据库。
给Entity类打注解:
Entity类其实就是实体类,我们需要存储的数据对应的类。类中字段对应表字段。
@Entity
public class ApkName implements Serializable{
private static final long serialVersionUID = -7061319036813384852L;
@Id
public Long id;
public String appcode;
public String appName;
@Transient
public boolean isChecked;
}
- 在类名称上标注:@Entity。
- 一般有一个id作为主键为Long类型,并且打上注解 @Id。
- 如果不需要存储到数据库中的字段可以打上@Transient注解。
- @Unique表示某个字段不可重复
打上注解之后,编译一下工程,就会发现这个类里生成了一些其他的代码,这些代码可以不用管,当我们改字段的时候可以先将生成的代码删除或者不管生成的代码,然后重新编译生成。
或者通过gradle task的 ./gradlew greendao
这个命令来生成对应的辅助代码。
编译之后greenDao的插件不只是在Entity里添加代码,还会生成一个greendao.gen的包,里面会有一些生成的代码,这些代码我们在操作数据库的时候会用到,但是我们不要去修改他们,修改字段的时候重新生成。
操作数据库:
这一步之前需要编译或者运行一下工程,让插件将需要生成的代码生成出来,操作数据库的时候会需要用到一些自动生成的代码。
在application里初始化DaoSession
public class MyApplication extends Application {
public static final String DATABASE_NAME = "ep_wallet";
private static DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
initDao();
}
public void initDao() {
DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(this, DATABASE_NAME);
Database db = openHelper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
}
这样在其他地方就可以通过getDaoSession来获取DaoSession
插入数据库:
if (data != null) {
Context context = App.getContext();
//从ApplicatoinContext里获取刚刚初始化的DaoSession
DaoSession daoSession = ((App)context.getApplicationContext()).getDaoSession();
ApkNameDao apkNameDao = daoSession.getApkNameDao();
apkNameDao.insertOrReplaceInTx(data);
getDaoSession().getApkNameDao().insertOrReplaceInTx(data);
}
获取到对应表的dao之后就可以做一些操作了,比如这里的insertOrReplaceInTx
通过事物去插入或者替换表数据。
查找数据:
查找数据同样是通过操作对应的Dao来做的
AppDataDao appDataDao = getDaoSession().getAppDataDao();
List<AppData> datas = appDataDao.queryBuilder()
//这里的where语句的两个条件中间是通过and连接的
.where(AppDataDao.Properties.IsMonth.eq(isMonth), AppDataDao.Properties.ProductLine.eq(SharedUtilsAppName.getCheckedAppCode()))
.orderDesc(AppDataDao.Properties.CreateTime)
.list();
return datas;
将数据库导出到sd卡
如果想要把自己的数据库导出来看看,或者定位问题,还可以使用这段代码将库拷贝出来:
推荐
DB Browser for SQLite
来查看导出的数据库,开源不要钱。
public static boolean copyDB2Sdcard() {
File outFile = new File(Environment.getExternalStorageDirectory(), "firefly.db");
if (outFile.exists()) {
outFile.delete();
}
File dbFile = App.getContext().getDatabasePath(App.DATABASE_NAME);
if (dbFile != null && dbFile.exists()) {
try {
FileChannel src = new FileInputStream(dbFile).getChannel();
FileChannel dst = new FileOutputStream(outFile).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
return true;
} catch (IOException e) {
outFile.delete();
Log.e(TAG, e.getMessage());
}
}
return false;
}
可能遇到的问题
- 报唯一ID冲突
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: ADDRESS_PAIR._id (code 1555)
解决方法:id的类型是Long,而不是long。