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

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后自动生成数据

android中数据库框架 GreenDao_第1张图片

这是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 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(); 

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

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

android中数据库框架 GreenDao_第2张图片

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 loadAllNote(){        return userDao.loadAll();    }    /**     * 生成按id倒排序的列表     * @return      倒排数据     */    public List loadAllNoteByOrder()    {        return userDao.queryBuilder().orderDesc(UserDao.Properties.Id).list();    }    /**     * 根据查询条件,返回数据列表     * @param where        条件     * @param params       参数     * @return             数据列表     */    public List 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 list){        if(list == null || list.isEmpty()){            return;        }        userDao.getSession().runInTx(new Runnable() {            @Override            public void run() {                for(int i=0; i/**     * 删除所有数据     */    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 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    } 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"_____________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

更多相关文章

  1. android数据存储之Network
  2. Android将数据存放到SDCard
  3. Settings的数据库中加新的字段
  4. android sqlite查询数据时报错: get field slot from row 0 col
  5. 【翻译】Android多线程下安全访问数据库
  6. android 联系人数据库
  7. android post 提交数据
  8. android SQLite数据库总结
  9. android应用安全――数据安全

随机推荐

  1. RelativeLayout常用属性介绍-----开发日
  2. Android Intent 用法汇总
  3. Android学习—— Android资料之-系统自带
  4. Android ImageButton android:scaleType
  5. Android: WebView tips & tricks
  6. android广播动态注册与发送流程分析
  7. Android(安卓)核心分析 之六 -----IPC框
  8. Android EditText进入页面不聚焦设置(进入
  9. ANDROID url资源站
  10. android横屏竖屏