android中数据库框架 GreenDao
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后自动生成数据
这是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();
封装 封装 封装 封装 封装 封装 封装 封装 封装
对代码进行封装,以便于多次调用
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
更多相关文章
- android数据存储之Network
- Android将数据存放到SDCard
- Settings的数据库中加新的字段
- android sqlite查询数据时报错: get field slot from row 0 col
- 【翻译】Android多线程下安全访问数据库
- android 联系人数据库
- android post 提交数据
- android SQLite数据库总结
- android应用安全――数据安全