GreenDao 介绍:
greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:
官网地址:http://greenrobot.org/greendao/
github:https://github.com/greenrobot/greenDAO
GreenDao 优点:
-
性能高,号称Android最快的关系型数据库
- 内存占用小
-
库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制
-
支持数据库加密 greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客Android数据存储之Sqlite采用SQLCipher数据库加密实战
- 简洁易用的API
配置GreenDao:
工程Gradle:
classpath 'org.greenrobot:greendao-gradle-plugin:3.1.0'
moudle gradle:
apply plugin: 'org.greenrobot.greendao'
greendao{
schemaVersion 1 //版本号
targetGenDir 'src/main/java' //默认文件生成位置
}
compile 'org.greenrobot:greendao:3.1.0'
代码示例:
创建一个实体类:
@Entity
public class User {
@Id
private Long id;
@Property(nameInDb = "USERNAME")
private String username;
@Property(nameInDb = "NICKNAME")
private String nickname;
}
然后 make project。自动
生成DaoMaster 、DaoSession、UserDao类。
注解:
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:定义与多个实体对象的关系
单例引用初始化类:
public class DBHelper {
private static DaoMaster.DevOpenHelper mHelper;
private static SQLiteDatabase db;
private static DaoMaster mDaoMaster;
private static DaoSession mDaoSession;
private static DBHelper mInstance;
public DBHelper() {
}
/**
* 单例引用
*
* @return
*/
public static DBHelper getInstance() {
if (mInstance == null) {
synchronized (DBHelper.class) {
if (mInstance == null) {
mInstance = new DBHelper();
}
}
}
return mInstance;
}
/**
* 初始化greenDao
* @param name 数据表的名称
*/
public DaoSession initDatabase(Context context,String name) {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(context, name, null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
return mDaoSession;
}
}
MainActivity.java(包含增,删,查,改)
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mAdd, mDelete, mUpdate, mFind;
private TextView mContext;
private UserDao userDao;
private DBHelper dbHelper = DBHelper.getInstance();
private String TABLE_NAME = "my.db3";//数据表的名称
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
//初始化对象
userDao = dbHelper.initDatabase(this, TABLE_NAME).getUserDao();
}
private void initEvent() {
mAdd.setOnClickListener(this);
mDelete.setOnClickListener(this);
mUpdate.setOnClickListener(this);
mFind.setOnClickListener(this);
}
private void initView() {
mContext = (TextView) findViewById(R.id.textView);
mAdd = (Button) findViewById(R.id.button);
mDelete = (Button) findViewById(R.id.button2);
mUpdate = (Button) findViewById(R.id.button3);
mFind = (Button) findViewById(R.id.button4);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
addDate();
break;
case R.id.button2:
deleteDate();
break;
case R.id.button3:
updateDate();
break;
case R.id.button4:
findDate();
break;
}
}
/**
* 增加数据
*/
private void addDate() {
User user = new User(null, "zhangsan"+ new Random().nextInt(100), "张三");
userDao.insert(user);
mContext.setText(user.getUsername() + user.getNickname());
}
/**
* 删除数据
*/
private void deleteDate() {
deleteUserById(2);
}
/**
* 根据主键删除User
*
* @param id User的主键Id
*/
public void deleteUserById(long id) {
userDao.deleteByKey(id);
}
/**
* 更改数据
*/
private void updateDate() {
User user = new User((long) 5, "lisi", "李四");
userDao.update(user);
}
/**
* 查找数据
*/
private void findDate() {
List<User> users = userDao.loadAll();
String userName = "";
for (int i = 0; i < users.size(); i++) {
userName += users.get(i).getUsername() + "," + users.get(i).getNickname() + "\n";
}
mContext.setText("查询全部数据==>" + userName);
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView"
android:layout_below="@+id/button3"
android:layout_alignParentStart="true"
android:layout_marginStart="11dp"
android:layout_marginTop="36dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_marginStart="27dp"
android:layout_marginTop="12dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删"
android:id="@+id/button2"
android:layout_alignBaseline="@+id/button"
android:layout_alignBottom="@+id/button"
android:layout_alignStart="@+id/button4"
android:layout_marginStart="18dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="改"
android:id="@+id/button3"
android:layout_marginTop="24dp"
android:layout_below="@+id/button"
android:layout_alignStart="@+id/button" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查"
android:id="@+id/button4"
android:layout_alignBaseline="@+id/button3"
android:layout_alignBottom="@+id/button3"
android:layout_toEndOf="@+id/button"
android:layout_marginStart="50dp" />
</RelativeLayout>
Demo
Demo参考:
http://blog.youkuaiyun.com/u012702547/article/details/52226163
http://www.cnblogs.com/whoislcj/p/5651396.html