Android数据库框架GreenDAO的使用&Demo

GreenDao 介绍:

greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:

Android数据库框架GreenDAO的使用&Demo_第1张图片

官网地址: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'
Android数据库框架GreenDAO的使用&Demo_第2张图片

moudle gradle:

apply plugin: 'org.greenrobot.greendao'

greendao{
        schemaVersion 1 //版本号
        targetGenDir 'src/main/java' //默认文件生成位置
    }

 compile 'org.greenrobot:greendao:3.1.0'

Android数据库框架GreenDAO的使用&Demo_第3张图片

代码示例:

创建一个实体类:

@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类。
Android数据库框架GreenDAO的使用&Demo_第4张图片

注解:

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 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





    

    

Demo

Demo

参考:

http://blog.csdn.net/u012702547/article/details/52226163

http://www.cnblogs.com/whoislcj/p/5651396.html

你可能感兴趣的:(Android框架/机制)