android中数据库框架 GreenDao

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24349695/article/details/79261315

android中数据库框架 GreenDao

代码已上传 http://download.csdn.net/download/qq_24349695/10240859

楼主之前的项目用到了本地缓存,SharedPreferences缓存的数据有限,就研究了SQLite,发现SQLite的存储查询过程比较繁琐,搜索过之后选择了GreeDao框架

GreenDao官网 http://greenrobot.org/greendao/documentation/introduction/

楼主使用android studio编译器

GreenDao配置

一、添加依赖

compile'org.greenrobot:greendao:3.0.1'  
compile'org.greenrobot:greendao-generator:3.0.0' 

二、配置app的Gradle

apply plugin: 'org.greenrobot.greendao'  

buildscript {  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'  
    }  
}  

greendao {  
    schemaVersion 1  
    daoPackage 'com.example.anonymous.greendao'  
    targetGenDir 'src/main/java'  
}  

schemaVersion—->指定数据库schema版本号,迁移等操作会用到
daoPackage——–>通过gradle插件生成的数据库相关文件,这里我设置的文件路径是com.example.anonymous.greendao
targetGenDir——–>这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了

buildscript {  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'  
    }  
}  

可以写在oroject build.gradle 中

如下

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

当然写在app的Gradle中也可以,官网是写在project中的

扫描二维码关注公众号,回复: 5363967 查看本文章

app的Gradle整体

apply plugin: 'com.android.application'  
apply plugin: 'org.greenrobot.greendao'  

buildscript {  
    repositories {  
        mavenCentral()  
    }  
    dependencies {  
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'  
    }  
}  

greendao {  
    schemaVersion 1  
    daoPackage 'com.example.anonymous.greendao'  
    targetGenDir 'src/main/java'  
}  

android {
    compileSdkVersion 25
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.ljm.greendao"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile'org.greenrobot:greendao:3.0.1'
    compile'org.greenrobot:greendao-generator:3.0.0'
    testCompile 'junit:junit:4.12'
}

添加数据库数据的实体类

@Entity  
public class User {  
    @Id  
    private Long id;  
    private String name;  
}  

@Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类
@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的

make project后自动生成数据

这里写图片描述

这是GreenDao自动为你生成的,路径就是你在gradle中配置的路径

增、删、改、查

数据库初始化

DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);    
DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());    
DaoSession daoSession = daoMaster.newSession();    
UserDao userDao = daoSession.getUserDao();    

my-db是数据库的名字,自己随便写就行。
通过GreenDao生成的代码,我们可以获取到实体类的实例,也就是数据库表的实例,这样我们才能操作数据库
一、增加

User user1 = new User(null,"zhangsan");  
userDao.insert(user1); 

二、删除

1、根据Id删除

User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();    
if(findUser != null){    
    userDao.deleteByKey(findUser.getId());    
}    

2、删除全部数据

 userDao.deleteAll();

三、更新、修改

//1.where是查询条件,
//2.unique()表示查询结果为一条数据,若数据不存在,findUser为null。
User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();    
if(findUser != null) {    
    findUser.setName("lisi");    
    userDao.update(findUser);    
    Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();    
} else {    
    Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();    
}    

zhangsan修改成lisi

四、查询

List<User> userList = userDao.queryBuilder()    
       .where(UserDao.Properties.Id.notEq(0))   
       .limit(5)    
       .build().list(); 

queryBuilder()方法,生成一个查找构造器,可以给构造器添加where条件判断、按照某某字段排序以及查询的条数等基本的数据库操作。list()方法表示查询的结果为一个集合.上述代码查询的就是ID号不等于999,按升序排序,做多5条,返回List类型

list()所有实体被加载到内存中。其结果通常是一个 ArrayList中,最容易使用。

listLazy()实体被装入点播存储器。一旦列表中的一个元素被首次访问,它被加载并高速缓存以供将来使用。必须关闭。

listLazyUncached()一个“虚拟”实体名单:任何接触到从数据库加载其数据的列表元素的结果。必须关闭。

ListIterator()通过懒加载的数据让你通过迭代的结果的。数据不会被缓存。必须关闭

上面查询的是一个list这个就是一个单例

User user = userDao.queryBuilder()  
       .where(UserDao.Properties.Id.eq(999)).unique(); 

封装 封装 封装 封装 封装 封装 封装 封装 封装

对代码进行封装,以便于多次调用

这里写图片描述

1、MyApplication:返回Context对象

2、DaoManager:初始化数据库,获取相应的操作对象

3、EntityManager:对数据库表的初始化,获取实体类的操作对象

MyApplication

public class MyApplication extends Application {  
    private static Context mContext;  

    @Override  
    public void onCreate() {  
        super.onCreate();  
        mContext = getApplicationContext();  
    }  

    public static Context getContext() {  
        return mContext;  
    }  
}  

EntityManager

public class EntityManager {
    private static EntityManager entityManager;
    public UserDao userDao;

    /**
     * 创建User表实例
     *
     * @return
     */
    public UserDao getUserDao(){
        userDao = DaoManager.getInstance().getSession().getUserDao();
        return userDao;
    }

    /**
     * 创建单例
     *
     * @return
     */
    public static EntityManager getInstance() {
        if (entityManager == null) {
            entityManager = new EntityManager();
        }
        return entityManager;
    }
}

DaoManager

public class DaoManager {
    private static DaoManager mInstance;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;

    private DaoManager() {
        DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "my-db", null);
        DaoMaster mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
        mDaoSession = mDaoMaster.newSession();
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }

    public DaoSession getSession() {
        return mDaoSession;
    }

    public static DaoManager getInstance() {
        if (mInstance == null) {
            mInstance = new DaoManager();
        }
        return mInstance;
    }
}

使用以插入为例子

UserDao userDao = EntityManager.getInstance().getUserDao();  
User user1 = new User(null,"zhangsan");  
userDao.insert(user1);  

DaoManager和EntityManager主要作用是对数据库和表的初始化工作抽出来作为复用,在Activity中使用的时候,我们可以直接操作表,不需要在初始化工作了。

所有操作封装

public class DbService {

    private static DbService instance;
    private static Context appContext;
    private UserDao userDao;

    private DbService() {
    }

    /**
     * 采用单例模式
     * @param context     上下文
     * @return            dbservice
     */
    public static DbService getInstance(Context context) {
        if (instance == null) {
            instance = new DbService();
            if (appContext == null){
                appContext = context.getApplicationContext();
            }

            instance.userDao = EntityManager.getInstance().getUserDao();
        }
        return instance;
    }
    /**
     * 根据用户id,取出用户信息
     * @param id           用户id
     * @return             用户信息
     */
    public User loadNote(long id) {
        if(!TextUtils.isEmpty(id + "")) {
            return userDao.load(id);
        }
        return  null;
    }

    /**
     * 取出所有数据
     * @return      所有数据信息
     */
    public List<User> loadAllNote(){
        return userDao.loadAll();
    }

    /**
     * 生成按id倒排序的列表
     * @return      倒排数据
     */
    public List<User> loadAllNoteByOrder()
    {
        return userDao.queryBuilder().orderDesc(UserDao.Properties.Id).list();
    }

    /**
     * 根据查询条件,返回数据列表
     * @param where        条件
     * @param params       参数
     * @return             数据列表
     */
    public List<User> queryNote(String where, String... params){
        return userDao.queryRaw(where, params);
    }


    /**
     * 根据用户信息,插件或修改信息
     * @param user              用户信息
     * @return 插件或修改的用户id
     */
    public long saveNote(User user){
        return userDao.insertOrReplace(user);
    }


    /**
     * 批量插入或修改用户信息
     * @param list      用户信息列表
     */
    public void saveNoteLists(final List<User> list){
        if(list == null || list.isEmpty()){
            return;
        }
        userDao.getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<list.size(); i++){
                    User user = list.get(i);
                    userDao.insertOrReplace(user);
                }
            }
        });

    }

    /**
     * 删除所有数据
     */
    public void deleteAllNote(){
        userDao.deleteAll();
        Toast.makeText(appContext, "删除成功", Toast.LENGTH_SHORT).show();
    }

    /**
     * 根据id,删除数据
     * @param id      用户id
     */
    public void deleteNote(long id){
        userDao.deleteByKey(id);
    }

    /**
     * 根据用户类,删除信息
     * @param user    用户信息类
     */
    public void deleteNote(User user){
        userDao.delete(user);
    }
}

具体使用,以删除所有数据为例。

findViewById(R.id.bt_deleteall).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DbService.getInstance(MainActivity.this).deleteAllNote();
                //DeleteAllData();
            }
        });

具体使用

public class MainActivity extends AppCompatActivity {
    private  UserDao userDao;
    private DaoSession daoSession;
    private DaoMaster daoMaster;
    private DaoMaster.DevOpenHelper devOpenHelper;
    private List<User> userList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        devOpenHelper = new DaoMaster.DevOpenHelper(MainActivity.this, "my-db", null);
        daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
        daoSession = daoMaster.newSession();
        //userDao = daoSession.getUserDao();
        userDao = EntityManager.getInstance().getUserDao();
        findViewById(R.id.bt_insert).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AddData();
            }
        });

        findViewById(R.id.bt_delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DeleteData();
            }
        });

        findViewById(R.id.bt_update).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UpdateData();
            }
        });

        findViewById(R.id.bt_query).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                QueryData();
            }
        });

         findViewById(R.id.bt_deleteall).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DbService.getInstance(MainActivity.this).deleteAllNote();
                //DeleteAllData();
            }
        });

    }

    private void AddData(){
        User user1 = new User(null,"zhangsan");
        userDao.insert(user1);
        Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
        /*QueryData();
        for(int i = 0;i<userList.size();i++){
            if("zhangsan".equals(userList.get(i).getName())){
                Toast.makeText(MainActivity.this, "用户已存在", Toast.LENGTH_SHORT).show();
            }else{
                User user1 = new User(null,"zhangsan");
                userDao.insert(user1);
                Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
            }
        }*/

    }
 private void DeleteAllData() {
        userDao.deleteAll();
        Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
    }

    private void DeleteData(){
        User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();
        if(findUser != null){
            userDao.deleteByKey(findUser.getId());
            Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
        }
    }

    private void UpdateData(){
        User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("zhangsan")).build().unique();
        if(findUser != null) {
            findUser.setName("lisi");
            userDao.update(findUser);
            Toast.makeText(MainActivity.this, "修改成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "用户不存在", Toast.LENGTH_SHORT).show();
        }
    }

    private void QueryData(){
        userList = userDao.queryBuilder()
                .where(UserDao.Properties.Id.notEq(0))
                .limit(5)
                .build().list();
        for(int i = 0;i<userList.size();i++){
            System.out.println("_____________i____________"+userList.get(i).getId()+"_______"+userList.get(i).getName());
        }
    }
}

ps:

一、这份代码只是简单的入门,代码中还是存在bug的,重复添加再点删除的时候会报错org.greenrobot.greendao.DaoException: Expected unique result, but count was 2,如果在项目中用到,在插入之前先查询下数据库,然后再插入,或者删除的时候根据ID去删除。
二、代码封装过后记得在AndroidManifest中添加MyApplication不然会报空指针异常的。
代码已上传 http://download.csdn.net/download/qq_24349695/10240859

猜你喜欢

转载自blog.csdn.net/qq_24349695/article/details/79261315