罗敬威的博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  今天看了下Android的ORM框架,然后就看到了GreenDao这个东东....感觉用了这个操作数据库就变得简单多了,不用再写那些SQL语句,和Hibernate框架挺像的....GreenDao就是将java对象映射到Sqlite数据库,通过对java对象进行存储、更新、删除、查询来操作数据库,简单化数据库操作。

  1. 配置环境
    1. 首先要引入两个jar包
      compile 'de.greenrobot:greendao-generator:2.0.0'
      compile 'de.greenrobot:greendao:2.0.0'

使用android studio的这里可以直接添加:

      

1、在项目中创建一个generator,dao、mode这三个包。generator包用于写生成dao和model的一个类,dao包用于存放与dao相关的类,model用于存放实体类  

         

 2.生成相关类

  在generator包下,新建一个生成dao和model代码的类ExampleDaoGenerator,在里面添加代码: 

 1 package com.itljw.greendaodemo.generator;
 2 
 3 import de.greenrobot.daogenerator.DaoGenerator;
 4 import de.greenrobot.daogenerator.Entity;
 5 import de.greenrobot.daogenerator.Schema;
 6 
 7 /**
 8  * Created by JW on 2015/11/5 09:44.
 9  * Email : 1481013719@qq.com
10  * Description :
11  */
12 public class ExampleDaoGenerator {
13 
14     public static void main(String[] args) {
15 
16         try {
17             /**
18              * 参数1:数据库版本号
19              * 参数2:默认的java package,如果不修改默认的报名,生成的dao和model都会在该包下
20              */
21             Schema schema = new Schema(1, "com.itljw.greendaodemo.model");
22             // 修改dao的包路径,dao将会生成在这个包下
23             schema.setDefaultJavaPackageDao("com.itljw.greendaodemo.dao");
24 
25             // 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。
26             // schema2.enableActiveEntitiesByDefault();
27             // schema2.enableKeepSectionsByDefault();
28 
29             addEntity(schema); // 添加一个实体对象
30 
31             // 自动生成代码,第二个参数:指定输出路径
32             new DaoGenerator().generateAll(schema, "D:/AndroidStudioProjects/GreenDaoDemo/app/src/main/java");
33         } catch (Exception e) {
34             e.printStackTrace();
35         }
36 
37     }
38 
39     /**
40      * 添加实体
41      *
42      * @param schema
43      */
44     private static void addEntity(Schema schema) {
45 
46         /**
47          * 一个实体类就关联到数据库中的一张表,数据库中表的名字默认就是类的名字
48          */
49         Entity user = schema.addEntity("User");
50 
51         user.setTableName("user"); // 可以设置表的名字
52 
53         // GreenDao会自动根据实体类的属性值来创建表的字段,并赋予默认值
54         user.addIdProperty().primaryKey().autoincrement();  // 指定id,主键自增
55 
56         user.addStringProperty("username").notNull(); // 不能为null
57         user.addStringProperty("password").notNull();
58 
59 
60     }
61 
62 }

   执行这个类,在控制台可以看到 : 

          

    然后就可以在dao和model两个包下查看到对应的代码了

3、在Application层,写两个方法,用于获取DaoMaster和DaoSession

 1 package com.itljw.greendaodemo;
 2 
 3 import android.app.Application;
 4 import android.content.Context;
 5 
 6 import com.itljw.greendaodemo.dao.DaoMaster;
 7 import com.itljw.greendaodemo.dao.DaoSession;
 8 
 9 /**
10  * Created by JW on 2015/11/5 10:54.
11  * Email : 1481013719@qq.com
12  * Description :
13  */
14 public class App extends Application {
15 
16     private App Instance;
17     private static DaoMaster daoMaster;
18     private static DaoSession daoSession;
19 
20     public App getInstance() {
21 
22         if (Instance == null) {
23             Instance = this;
24         }
25 
26         return Instance;
27     }
28 
29     /**
30      * 获取DaoMaster
31      *
32      * @param context
33      * @return
34      */
35     public static DaoMaster getDaoMaster(Context context) {
36 
37         if (daoMaster == null) {
38 
39             DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context, ConstantValue.DBName, null);
40 
41             daoMaster = new DaoMaster(helper.getWritableDatabase());
42 
43         }
44         return daoMaster;
45     }
46 
47     /**
48      * 获取DaoSession对象
49      *
50      * @param context
51      * @return
52      */
53     public static DaoSession getDaoSession(Context context) {
54 
55         if (daoSession == null) {
56             if (daoMaster == null) {
57                 getDaoMaster(context);
58             }
59             daoSession = daoMaster.newSession();
60         }
61 
62         return daoSession;
63     }
64 
65 }

  4、测试:

布局文件: 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:orientation="vertical">
 6 
 7     <Button
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:onClick="insert"
11         android:text="Insert" />
12 
13 
14     <Button
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:onClick="delete"
18         android:text="delete" />
19 
20 
21     <Button
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:onClick="update"
25         android:text="update" />
26 
27 
28     <Button
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:onClick="query"
32         android:text="query" />
33 
34     <Button
35         android:layout_width="wrap_content"
36         android:layout_height="wrap_content"
37         android:onClick="QueryById"
38         android:text="QueryById" />
39 
40     <Button
41         android:layout_width="wrap_content"
42         android:layout_height="wrap_content"
43         android:onClick="deleteAll"
44         android:text="deleteAll"/>
45 
46 
47 </LinearLayout>

MainActivity代码:

  1 package com.itljw.greendaodemo;
  2 
  3 import android.os.Bundle;
  4 import android.support.v7.app.AppCompatActivity;
  5 import android.view.View;
  6 import android.widget.Toast;
  7 
  8 import com.itljw.greendaodemo.dao.DaoSession;
  9 import com.itljw.greendaodemo.dao.UserDao;
 10 import com.itljw.greendaodemo.model.User;
 11 
 12 import java.util.List;
 13 
 14 import de.greenrobot.dao.query.QueryBuilder;
 15 
 16 public class MainActivity extends AppCompatActivity {
 17 
 18 
 19     private DaoSession daoSession;
 20     private UserDao userDao;
 21 
 22     @Override
 23     protected void onCreate(Bundle savedInstanceState) {
 24         super.onCreate(savedInstanceState);
 25         setContentView(R.layout.activity_main);
 26 
 27         daoSession = App.getDaoSession(this); // 获取DaoSession
 28         userDao = daoSession.getUserDao(); // 获取UserDao 可对User进行操作
 29 
 30 
 31     }
 32 
 33     /**
 34      * Insert数据
 35      * @param view
 36      */
 37     public void insert(View view){
 38 
 39         for(int i = 0 ;i < 10 ; i ++){
 40 
 41             User user = new User();
 42             user.setUsername("haha" + i);
 43             user.setPassword("test" + i);
 44 
 45             // 直接操作对象,将对象插入数据库,这个和Hibernate的一样
 46             userDao.insert(user);
 47         }
 48 
 49         Toast.makeText(MainActivity.this, "插入数据!", Toast.LENGTH_SHORT).show();
 50 
 51     }
 52 
 53     /**
 54      * Delete数据 根据id删除对应数据
 55      * @param view
 56      */
 57     public void delete(View view){
 58         userDao.deleteByKey(1l);
 59     }
 60 
 61     /**
 62      * Update数据 根据id更新对应的数据
 63      * @param view
 64      */
 65     public void update(View view){
 66 
 67         User user = new User();
 68         user.setId(2l);
 69         user.setUsername("update");
 70         user.setPassword("update_psw");
 71 
 72         userDao.update(user);
 73     }
 74 
 75     /**
 76      * Query数据
 77      * @param view
 78      */
 79     public void query(View view){
 80         QueryBuilder<User> queryBuilder = userDao.queryBuilder();
 81         List<User> userList = queryBuilder.list(); // 使用list进行查询
 82         System.out.println("userList : " + userList.toString());
 83     }
 84 
 85     /**
 86      * DeleteAll 删除所有数据
 87      * @param view
 88      */
 89     public void deleteAll(View view){
 90         userDao.deleteAll();
 91     }
 92 
 93     /**
 94      * 根据id查询对应的数据
 95      * @param view
 96      */
 97     public void QueryById(View view){
 98 
 99         QueryBuilder<User> queryBuilder = userDao.queryBuilder();
100 
101         // where
102         QueryBuilder<User> query = queryBuilder.where(UserDao.Properties.Id.eq(6));
103 
104         System.out.println("query:" +  query.list().toString());
105 
106     }
107 
108 }

这样就可以简单的操作数据库了

posted on 2015-11-05 14:15  luojinwei  阅读(748)  评论(0编辑  收藏  举报