greeDao 使用示例,多表关联,增删改查

简介

greenDao是一个使用于android的ORM框架,现在主流的ORM框架有OrmLite,SugarORM,Active Android,Realm以及GreenDAO.greenDao的性能远远高于同类的ORM框架,具体的测试结果官网有。

2.x示例代码

https://github.com/7449/AndroidDevelop/tree/master/greenDao

3.x示例代码

https://github.com/7449/AndroidDevelop/tree/master/greendao3.0

多表关联示例代码

https://github.com/7449/AndroidDevelop/tree/master/greendaoMultiTable

读写第三方数据表,示例代码

https://github.com/7449/AndroidDevelop/tree/master/greenDaoExternal

有时候数据表会由后台分发而不是自动生成,所以这里简单介绍下怎么使用greendao操作这种情况下的数据表

需要注意以下几点
    
    1:android数据库操作都是在databases文件夹下,所以要把需要动的数据库复制到databases文件夹下

    /**
     * assets目录下的db转移到databases
     */
    public void copyDBToDatabases() {
        try {
            String outFileName = DB_PATH + DB_NAME;
            File file = new File(DB_PATH);
            if (!file.mkdirs()) {
                file.mkdirs();
            }
            File dataFile = new File(outFileName);
            if (dataFile.exists()) {
                dataFile.delete();
            }
            InputStream myInput;
            myInput = getApplicationContext().getAssets().open(DB_NAME);
            OutputStream myOutput = new FileOutputStream(outFileName);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            myOutput.flush();
            myOutput.close();
            myInput.close();
        } catch (IOException e) {
            Log.i(TAG, "error--->" + e.toString());
            e.printStackTrace();
        }

    }


    2:geenDao自动生成的时候table 默认为TABLENAME,默认id生成时"_id",这些生成的字段必须要和数据表中的字段一致,可以用 nameInDb="" 指定字段name和tableName


    @Entity(nameInDb = "blacklist")
    public class ExternalBean {
        @Property(nameInDb = "id")
        private Integer id;
        @Property(nameInDb = "email")
        private String email;
        @Generated(hash = 1314000312)
        public ExternalBean(Integer id, String email) {
            this.id = id;
            this.email = email;
        }
        @Generated(hash = 981826822)
        public ExternalBean() {
        }
        public Integer getId() {
            return this.id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getEmail() {
            return this.email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
    }

3.x更新

项目build.gradle添加

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

app下的build.gradle添加

apply plugin: 'org.greenrobot.greendao'

compile 'org.greenrobot:greendao:3.2.0'

    //修改生成类的位置
    greendao {
        targetGenDir 'src/main/java/' //生成源文件的目录,默认是build目录中的(build/generated/source/greendao)
//        daoPackage //生成的DAO,DaoMaster和DaoSession的包名。默认是实体的包名
//        schemaVersion //当前数据库结构的版本
//        generateTests //设置是否自动生成单元测
//        targetGenDirTest //生成的单元测试的根目录
    }

然后自定义UserBean类

@Entity
public class UserBean {

    @Id
    private Long id;
    private String name;
    private int age;
    @Generated(hash = 1032023074)
    public UserBean(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Generated(hash = 1203313951)
    public UserBean() {
    }
}

注解:

@Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
@Id
@NotNull 不为null
@Unique 唯一约束
@ToMany 一对多
@OrderBy 排序
@ToOne 一对一
@Transient 不存储在数据库中
@generated 由greendao产生的构造函数或方法

重新rebuild 一下项目,就可以看到greenDao自动生成的数据库相关类,比2.X时确实好用多了,之后用法还和以前一样

2.x使用

用greenDao实现了数据库的增删改查,确实比以前自己写SQL语句舒服多了,不用再考虑SQL语句很方便。

IDE工具:AndroidStudio

gradle引用

compile 'org.greenrobot:greendao-generator:2.2.0'
compile 'org.greenrobot:greendao:2.2.0'

Generator

单独创建一个目录,起名为sql,然后创建一个GreenDaoGenerator,注意一点是这里就要运行一下这个java类,不是app是这个java类,需要单独运行一下生成sql代码

public class MyGreenDaoGenerator {

    public static void main(String[] args) throws Exception {
        //版本号,包名
        Schema schema = new Schema(1, "github.com.greendao.sql");
        Entity user = schema.addEntity("User");
        user.addIdProperty().primaryKey();
        user.addStringProperty("userName").notNull();
        user.addStringProperty("userSex").notNull();
        new DaoGenerator().generateAll(schema, "./app/src/main/java");
    }

}

最后会自动生成文件

增删改查

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText userName;
    private EditText userSex;
    private EditText etDelete;
    private EditText etUpDateId;
    private EditText etUpDateName;
    private EditText etUpDateSex;
    private EditText etSearch;


    private SQLiteDatabase writableDatabase;
    private UserDao userDao;
    private ListView listView;
    private SimpleCursorAdapter simpleCursorAdapter;


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

        userName = (EditText) findViewById(R.id.userName);
        userSex = (EditText) findViewById(R.id.userSex);
        listView = (ListView) findViewById(R.id.list);
        etDelete = (EditText) findViewById(R.id.et_delete);
        etUpDateId = (EditText) findViewById(R.id.et_update_id);
        etUpDateName = (EditText) findViewById(R.id.et_update_name);
        etUpDateSex = (EditText) findViewById(R.id.et_update_sex);
        etSearch = (EditText) findViewById(R.id.et_search);

        findViewById(R.id.add).setOnClickListener(this);
        findViewById(R.id.delete).setOnClickListener(this);
        findViewById(R.id.update).setOnClickListener(this);
        findViewById(R.id.search).setOnClickListener(this);

        init();
    }

    private void init() {
        writableDatabase = new DaoMaster.DevOpenHelper(this, "greendao", null).getWritableDatabase();
        DaoSession daoSession = new DaoMaster(writableDatabase).newSession();

        //得到Dao的对象
        userDao = daoSession.getUserDao();
        // 遍历表中所有的数据

        Cursor cursor = writableDatabase.query(userDao.getTablename(), userDao.getAllColumns(), null, null, null, null, null);
        String[] from = {UserDao.Properties.UserName.columnName, UserDao.Properties.UserSex.columnName};
        int[] id = {android.R.id.text1, android.R.id.text2};
        simpleCursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, id, Adapter.NO_SELECTION);
        listView.setAdapter(simpleCursorAdapter);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add:
                if (!userName.getText().toString().isEmpty() && !userSex.getText().toString().isEmpty()) {
                    addSQLite(userName.getText().toString(), userSex.getText().toString());
                    userName.getText().clear();
                    userSex.getText().clear();
                } else {
                    Toast.makeText(getApplicationContext(), "name sex must not null", Toast.LENGTH_LONG).show();
                }
                break;

            case R.id.delete:
                if (!etDelete.getText().toString().isEmpty()) {
                    deleteSQLite(Long.valueOf(etDelete.getText().toString().trim()));
                    etDelete.getText().clear();
                } else {
                    Toast.makeText(getApplicationContext(), "id illegal", Toast.LENGTH_LONG).show();
                }
                break;

            case R.id.update:
                if (!etUpDateId.getText().toString().isEmpty() && !etUpDateName.getText().toString().isEmpty() && !etUpDateSex.getText().toString().isEmpty()) {
                    upDateSQLite(Long.parseLong(etUpDateId.getText().toString().trim()), etUpDateName.getText().toString().trim(), etUpDateSex.getText().toString().trim());
                    etUpDateId.getText().clear();
                    etUpDateName.getText().clear();
                    etUpDateSex.getText().clear();
                } else {
                    Toast.makeText(getApplicationContext(), "id name sex must not null", Toast.LENGTH_LONG).show();
                }
                break;

            case R.id.search:
                if (!etSearch.getText().toString().isEmpty()) {
                    searchSQLite(Long.parseLong(etSearch.getText().toString().trim()));
                    etSearch.getText().clear();
                } else {
                    Toast.makeText(getApplicationContext(), "id illegal", Toast.LENGTH_LONG).show();
                }
                break;

        }
        Cursor cursor = writableDatabase.query(userDao.getTablename(), userDao.getAllColumns(), null, null, null, null, null);
        simpleCursorAdapter.swapCursor(cursor);
    }

    //add sql data
    private void addSQLite(String name, String sex) {

        User user = new User(null, name, sex);

        userDao.insert(user);
    }


    //delete sql data
    private void deleteSQLite(Long id) {

        userDao.deleteByKey(id);
        //delete sql all;
//        userDao.deleteAll();

    }


    //update sql data
    private void upDateSQLite(long id, String name, String sex) {
        userDao.update(new User(id, name, sex));
    }

    //search sql data
    private void searchSQLite(long id) {
        QueryBuilder<User> queryBuilder = userDao.queryBuilder().where(UserDao.Properties.Id.eq(id));
        // .list() Returns a collection of entity classes
        List<User> user = queryBuilder.list();
        // If you only want results , use .unique() method
        // Person person = queryBuilder.unique();
        new AlertDialog
                .Builder(this)
                .setMessage(user != null && user.size() > 0 ? user.get(0).getUserName() + "--" + user.get(0).getUserSex() : "data null")
                .setPositiveButton("ok", null).create().show();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容