Android数据库框架之greenDAO

greenDAO(数据库框架)

作为一个只会踢球的小白菜,在客户端一直使用的是SQLite数据库,觉得还不错,不算太复杂。一次偶然的机会,在和别人的交谈中了解到了greenDAO数据库框架。当时是一脸懵的状态,然后百度了一下发现,它应该算是当前最火的数据库开源框架了,它是一个将对象映射到SQLite数据库中的轻量且快速的ORM(object / relational mapping)解决方案。最主要的是它的代码量少了许多,再也不用手动编码啦

相对于SQLite数据库,greenDAO的优点如下:

  • 存取速度快
  • 支持数据库加密
  • 轻量级
  • 激活实体
  • 支持缓存
  • 代码自动生成(我很喜欢这个)

了解过greenDAO之后,内心抑制不住激动地小手手,就赶紧码了一个简单的增删改查功能。给各位大佬奉上

源码这里有,下面也有

GitHub地址:https://github.com/cctxwan/greenDAO_Demo
CSDN地址:https://download.csdn.net/download/qq_35840038/11018960

没有效果图的文章简直就是扯淡。效果图如下:

在这里插入图片描述

看完效果之后,就该进入到正式得配置和编码中啦,首先需要配置。很简单,如下:

//在项目build里面的dependencies里添加这行
//添加greenDAO
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin

如下图:
在这里插入图片描述

然后在moudle的build里面添加这行

//添加greenDAO
apply plugin: 'org.greenrobot.greendao' // apply plugin

greendao{
    schemaVersion 1
    daoPackage 'com.cc.greendao_demo.cc'
    targetGenDir 'src/main/java'
}

//添加greenDAO
implementation 'org.greenrobot:greendao:3.2.2' // add library

如下图:
在这里插入图片描述
注:配置就是这么的简单粗暴,代码在下面。

配置完成之后设置实体类:

package com.cc.greendao_demo.model;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;

/**
 * 实体类
 */
@Entity
public class UserInfo {

    /** id(主键,自增。千万要注意,不能用int) */
    @Id(autoincrement = true)
    private Long id;

    /** 姓名(不可为空) */
    private String name;

    /** 电话(可以为空) */
    private String phonenum;

}

实体类属性写完后,按Ctrl+F9,as会自动生成三个类和实体类的getset方法。

生成的三个类分别是:

  • DaoMaster: DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。
  • DaoSession: 管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。
  • UserInfoDao: 数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。

下来就要手写Application类来调用

application.class:

package com.cc.greendao_demo.db;

import android.app.Application;
import android.database.sqlite.SQLiteDatabase;

import com.cc.greendao_demo.cc.DaoMaster;
import com.cc.greendao_demo.cc.DaoSession;

/**
 * 官方要求需要写到Application里面
 */
public class MyApplication extends Application {

    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    public static MyApplication instances;

    @Override
    public void onCreate() {
        super.onCreate();
        instances = this;
        setDatabase();
    }

    public static MyApplication getInstances(){
        return instances;
    }

    /**
     * 设置greenDAO
     */
    private void setDatabase() {
        // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
        // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO已经帮你做了。
        // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
        // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
        mHelper = new DaoMaster.DevOpenHelper(this, "cc-db", null);
        db = mHelper.getWritableDatabase();
        // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoSession getDaoSession() {
        return mDaoSession;
    }

    public SQLiteDatabase getDb() {
        return db;
    }
}

所有的写完之后在activity中获取到dao,然后调用相应的方法就好

代码如下:
activity.class:

package com.cc.greendao_demo.activity;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import com.cc.greendao_demo.adapter.ListViewAdapter;
import com.cc.greendao_demo.cc.DaoMaster;
import com.cc.greendao_demo.cc.DaoSession;
import com.cc.greendao_demo.cc.UserInfoDao;
import com.cc.greendao_demo.db.MyApplication;
import com.cc.greendao_demo.model.UserInfo;

import java.util.ArrayList;
import java.util.List;

/**
 * greenDao的增删改查
 * @author 财财
 * @version 2019年3月13日14:08:00
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {

    Activity activity = MainActivity.this;

    ListView listView;

    Button bt1;

    List<UserInfo> datas = new ArrayList<>();

    ListViewAdapter listViewAdapter;


    UserInfoDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取数据库操作dao
        dao = MyApplication.getInstances().getDaoSession().getUserInfoDao();

        initView();
        initData();
    }



    private void initData() {
        //查询所有的数据
        datas = dao.queryBuilder().build().list();
        //使用adapter显示到listview中
        listViewAdapter = new ListViewAdapter(activity, datas);
        //绑定
        listView.setAdapter(listViewAdapter);

        //点击事件
        listView.setOnItemClickListener(this);
        //长按事件
        listView.setOnItemLongClickListener(this);
    }

    private void initView() {
        listView = findViewById(R.id.listview);
        bt1 = findViewById(R.id.button1);

        bt1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int temdId = v.getId();
        if(temdId == R.id.button1){
            //添加数据
            dao.insert(new UserInfo(null, "张三", "15698512368"));
            dao.insert(new UserInfo(null, "李四", "15698512368"));
            dao.insert(new UserInfo(null, "王五", "15698512368"));
            dao.insert(new UserInfo(null, "赵六", "15698512368"));
            dao.insert(new UserInfo(null, "刘七", "15698512368"));
            dao.insert(new UserInfo(null, "曹八", "15698512368"));
            dao.insert(new UserInfo(null, "苏九", "15698512368"));
            dao.insert(new UserInfo(null, "寇十", "15698512368"));
            dao.insert(new UserInfo(null, "陈一", "15698512368"));
            dao.insert(new UserInfo(null, "庄二", "15698512368"));
            notifyListView();

        }
    }

    /**
     * 跟新ListView,不知为啥adapter.notifyDataSetChanged()没反应
     */
    public void notifyListView(){
        //先清空集合里面的数据
        datas.clear();
        //重新赋值
        datas = dao.loadAll();
        //重新绑定
        listViewAdapter = new ListViewAdapter(MainActivity.this, datas);
        listView.setAdapter(listViewAdapter);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d("TAG", "单击事件");
                //修改数据不能相同,否则会报错
                dao.update(new UserInfo(datas.get(position).getId(), datas.get(position).getName() + "我被修改啦", datas.get(position).getPhonenum()));
                //刷新数据
                notifyListView();
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d("TAG", "长按事件");
        //根据对应的id删掉该列数据
        dao.deleteByKey(datas.get(position).getId());
        //刷新数据
        notifyListView();
        return true;
    }
}


注:代码在这里就全部结束啦

特别注意:AndroidManifest.xml配置

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

在这里插入图片描述

到这为止,所有的功能都已经添加ok了。

附上demo源码

GitHub地址:https://github.com/cctxwan/greenDAO_Demo
CSDN地址:https://download.csdn.net/download/qq_35840038/11018960

q:486789970
email:mr.cai_cai@foxmail.com

如果有什么问题,欢迎大家指导。并相互联系,希望能够通过文章互相学习。

																								---财财亲笔
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GreenDao是一个高效、轻量级、快速的ORM(对象关系映射)框架,可以方便地将Java对象映射到SQLite数据库中。下面是GreenDao的引入和使用步骤: 1. 在build.gradle文件中添加以下依赖: ```groovy dependencies { implementation 'org.greenrobot:greendao:3.3.0' } ``` 2. 在app/build.gradle文件中添加以下配置: ```groovy android { defaultConfig { //... javaCompileOptions { annotationProcessorOptions { arguments = ["schemaVersion": "1", "daoPackage": "com.example.myapp.db"] } } } } greendao { schemaVersion 1 daoPackage 'com.example.myapp.db' targetGenDir 'src/main/java' } ``` 这些配置将告诉GreenDao在编译时生成DAO(数据访问对象)类。schemaVersion是数据库的版本号,daoPackage是生成DAO类的包名,targetGenDir是DAO类的生成目录。 3. 创建实体类,例如: ```java @Entity public class User { @Id(autoincrement = true) private Long id; private String name; private int age; // getters and setters } ``` @Entity注解表示这是一个实体类,@Id注解表示这是主键,autoincrement = true表示主键自增。 4. 在app/src/main/java目录下创建一个名为“greenDao”的包,并在该包下创建一个名为“DaoMasterOpenHelper”的类。该类继承自DaoMaster.OpenHelper,用于创建和升级数据库。例如: ```java public class DaoMasterOpenHelper extends DaoMaster.OpenHelper { public DaoMasterOpenHelper(Context context, String name) { super(context, name); } @Override public void onCreate(Database db) { super.onCreate(db); } @Override public void onUpgrade(Database db, int oldVersion, int newVersion) { // 数据库升级逻辑 } } ``` 5. 初始化GreenDao,在Application类的onCreate()方法中添加以下代码: ```java public class MyApp extends Application { private DaoSession daoSession; @Override public void onCreate() { super.onCreate(); DaoMasterOpenHelper helper = new DaoMasterOpenHelper(this, "mydb"); Database db = helper.getWritableDb(); daoSession = new DaoMaster(db).newSession(); } public DaoSession getDaoSession() { return daoSession; } } ``` 这里创建了一个DaoMasterOpenHelper实例,并通过它获取可写的数据库,然后创建一个DaoSession实例。 6. 使用GreenDao,例如: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaoSession daoSession = ((MyApp) getApplication()).getDaoSession(); User user = new User(); user.setName("Tom"); user.setAge(18); daoSession.getUserDao().insert(user); List<User> userList = daoSession.getUserDao().queryBuilder() .where(UserDao.Properties.Age.gt(10)) .orderAsc(UserDao.Properties.Age) .list(); } } ``` 这里通过getApplication()方法获取MyApp实例,然后通过getDaoSession()方法获取DaoSession实例。接着创建了一个User实例并插入到数据库中。最后使用查询构建器查询年龄大于10的所有用户,并按年龄升序排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁抢我的小口口

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值