GreenDao的基本使用(android数据库)
来源:互联网 发布:ims数据购买 编辑:程序博客网 时间:2024/04/27 23:03
在android中,在有些数据量相对较大或者处于安全考虑的情况下,会使用android自带的数据库—-sqlite:
但是使用sqlite需要考虑到以下几点:
1.严格控制数据库资源的打开与关闭(db,cursor); 2.在遍历数据时候取到的是cursor要转化为list再使用 3.事务回滚,可以大大优化数据库的效率;
在android开发中我们会遇到一些数据库,内部框架做了封装使用起来比较方便:如 ormLite greenDao等
相比而言,greendao应该是最快,效率最高的数据库框架(greendao官网有介绍),ok直接代码详解greemdao.进入正题:
1.greenDao框架的初始化(准备工作与接入)
1.1
//首先实在project的build中配置:
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' //greenDao的配置 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' }}
1.2
//在moudle的build中配置
apply plugin: 'com.android.application'//greenDao依赖apply plugin: 'org.greenrobot.greendao'android { ........ //在创建玩实体类之后make project 存放greenDao DB 的包位置 greendao { schemaVersion 1 daoPackage 'com.example.mysmall.greendao.greendao'//这个是生成代码保存的包名 targetGenDir 'src/main/java'//保存到java代码路径 }}dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) ..... //greenDao的配置 compile 'org.greenrobot:greendao:3.2.2' compile 'org.greenrobot:greendao-generator:3.2.2'}
2.创建实体类 接着点击 Build -> Make Project
创建实体类: @Generated(hash = 664611791)中的hash参数 是build->Make Project之后生成的:
@Entitypublic class User { /**定义主键*/ @Id(autoincrement = true) private long id; private String name; private int age; private String sex; @Generated(hash = 664611791) public User(long id, String name, int age, String sex) { this.id = id; this.name = name; this.age = age; this.sex = sex; } @Generated(hash = 586692638) public User() { } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + '}'; }}
需要注意一下 上面实体类通过注解会映射为数据库表(就不需要自己去写数据库创建的sal);
ok~下面来看注解:
@Entity表明该类是持久化的类(持久化含义,存入数据库文件中,作本地化处理)
@Id选择一个long或Long类型的属性作为该实体所对应数据库中数据表的主键(注意数据类型必须是long)
@Generated写在构造方法前
然后是关键性的一步build->Make Project然后自动生成数据库的操作类:
就是DaoMaster DaoSession UserDao;
3数据库操作类生成 开始用greenDao操作数据库:(用log来展示每次操作的数据变化):
3.1数据库的初始化
在 App(extends Application中实现代码):
public class App extends Application{ private UserDao userDao; private static App mApp; @Override public void onCreate() { super.onCreate(); /**初始化数据库*/ DaoMaster.DevOpenHelper mHelper = new DaoMaster. DevOpenHelper(this, "user-db", null); SQLiteDatabase db = mHelper.getWritableDatabase(); DaoMaster master = new DaoMaster(db); DaoSession daoSession = master.newSession(); userDao = daoSession.getUserDao(); } public static App getInstance(){ if (mApp == null){ synchronized (App.class){ mApp = new App(); } } return mApp; } public UserDao getDao(){ return userDao; }}
核心代码:
DaoMaster.DevOpenHelper mHelper = new DaoMaster. DevOpenHelper(this, "user-db", null); SQLiteDatabase db = mHelper.getWritableDatabase(); DaoMaster master = new DaoMaster(db); DaoSession daoSession = master.newSession(); userDao = daoSession.getUserDao();
3.2数据库的增删改查:
private void initDelete() { //mDao.deleteByKey(Long.valueOf(1)); String trim = mPos.getText().toString().trim(); if (trim != null && !trim.equals("")) { mDao.deleteByKey(Long.valueOf(trim)); QueryBuilder<User> qb = mDao.queryBuilder(); List<User> list = qb.where(UserDao.Properties.Id.eq(Long.valueOf(trim))).list(); if (list.size()<1){ Toast.makeText(this,"指定数据删除成功",Toast.LENGTH_SHORT).show(); } }else { mDao.deleteAll(); } } private void initUpdate() { String trim = mPos.getText().toString().trim(); if (trim != null && !trim.equals("")) { User user = mDao.load(Long.valueOf(trim)); user.setName("保尔柯察金"); mDao.update(user); } } private void initInsert() { for (int i = 0; i < 5; i++) { mIndex ++; if (isEcho(String.valueOf(mIndex))){ Toast.makeText(this,"主键重复",Toast.LENGTH_SHORT).show(); }else { User user = new User(Long.valueOf(mIndex), "张三" + i, 18, "男"); mDao.insert(user); } } } private void initSelect() { Query<User> query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build(); List<User> list = query.list(); for (int i = 0; i < list.size(); i++) { User user = list.get(i); String s = user.toString(); Log.i("query",s); } } /**判断主键是否重复*/ private boolean isEcho(String id){ QueryBuilder<User> qb = mDao.queryBuilder(); List<User> list = qb.where(UserDao.Properties.Id.eq(id)).list(); if (list.size() > 0){ return true; } return false; }
ok~ 从上面代码中可以看到 没有依据sql的操作语句 而且 每次操作完成资源是自动开关,不需要你手动开关数据库/游标/事务
是不是很方便呢;
4完整代码展示 :
下面粘贴完整代码:
//app
package com.example.mysmall.greendao.global;import android.app.Application;import android.database.sqlite.SQLiteDatabase;import com.example.mysmall.greendao.greendao.DaoMaster;import com.example.mysmall.greendao.greendao.DaoSession;import com.example.mysmall.greendao.greendao.UserDao;/** * Created by houruixiang on 2017/10/31. */public class App extends Application{ private UserDao userDao; private static App mApp; @Override public void onCreate() { super.onCreate(); /**初始化数据库*/ DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(this, "user-db", null); SQLiteDatabase db = mHelper.getWritableDatabase(); DaoMaster master = new DaoMaster(db); DaoSession daoSession = master.newSession(); userDao = daoSession.getUserDao(); } public static App getInstance(){ if (mApp == null){ synchronized (App.class){ mApp = new App(); } } return mApp; } public UserDao getDao(){ return userDao; }}
//MainActivity
package com.example.mysmall.greendao;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import com.example.mysmall.greendao.global.App;import com.example.mysmall.greendao.greendao.UserDao;import com.example.mysmall.greendao.model.User;import org.greenrobot.greendao.query.Query;import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mSelect; private Button mInsert; private Button mUpdate; private Button mDelete; private int mIndex; private UserDao mDao; private EditText mPos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /**获取数据库操作对象*/ mDao = ((App) getApplication()).getDao(); initView(); } private void initView() { mSelect = (Button) findViewById(R.id.seclet); mInsert = (Button) findViewById(R.id.insert); mUpdate = (Button) findViewById(R.id.update); mDelete = (Button) findViewById(R.id.delete); mPos = (EditText) findViewById(R.id.tarPosition); mSelect.setOnClickListener(this); mInsert.setOnClickListener(this); mUpdate.setOnClickListener(this); mDelete.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.seclet: initSelect(); break; case R.id.insert: initInsert(); break; case R.id.update: initUpdate(); break; case R.id.delete: initDelete(); break; } } private void initDelete() { //mDao.deleteByKey(Long.valueOf(1)); String trim = mPos.getText().toString().trim(); if (trim != null && !trim.equals("")) { mDao.deleteByKey(Long.valueOf(trim)); QueryBuilder<User> qb = mDao.queryBuilder(); List<User> list = qb.where(UserDao.Properties.Id.eq(Long.valueOf(trim))).list(); if (list.size()<1){ Toast.makeText(this,"指定数据删除成功",Toast.LENGTH_SHORT).show(); } }else { mDao.deleteAll(); } } private void initUpdate() { String trim = mPos.getText().toString().trim(); if (trim != null && !trim.equals("")) { User user = mDao.load(Long.valueOf(trim)); user.setName("保尔柯察金"); mDao.update(user); } } private void initInsert() { for (int i = 0; i < 5; i++) { mIndex ++; if (isEcho(String.valueOf(mIndex))){ Toast.makeText(this,"主键重复",Toast.LENGTH_SHORT).show(); }else { User user = new User(Long.valueOf(mIndex), "张三" + i, 18, "男"); mDao.insert(user); } } } private void initSelect() { Query<User> query = mDao.queryBuilder().orderAsc(UserDao.Properties.Id).build(); List<User> list = query.list(); for (int i = 0; i < list.size(); i++) { User user = list.get(i); String s = user.toString(); Log.i("query",s); } } /**判断主键是否重复*/ private boolean isEcho(String id){ QueryBuilder<User> qb = mDao.queryBuilder(); List<User> list = qb.where(UserDao.Properties.Id.eq(id)).list(); if (list.size() > 0){ return true; } return false; }}
总而言之 greendao的框架作为android的数据库框架会很大程度提高效率;有兴趣的可以探讨其内部实现原理机制~感谢阅读 天气转冷 小心感冒哦
- Android数据库之greendao的基本使用
- GreenDao的基本使用(android数据库)
- Android操作数据库的框架-GreenDao基本使用记录
- Android--------GreenDao数据库的使用
- Android数据库 GreenDao的使用
- Android GreenDao基本使用
- Android GreenDao基本使用
- Android 数据库 GreenDao使用
- GreenDao 的基本使用
- greenDao的基本使用
- greenDao的基本使用
- GreenDao的基本使用
- greenDao的基本使用
- Android greenDao 数据库的使用(一)
- Android greenDao 数据库的使用(二)
- Android greenDao 数据库的使用(三)
- Android数据库操作--greenDAO的入门使用
- android 数据库greenDao的简单使用
- Mongo安装windows服务
- 测试优化求解算法的一些简单绘图函数
- Git常用命令总结
- IOS CoreData持久化
- Android Framework层添加一个HAL模块
- GreenDao的基本使用(android数据库)
- java排序
- 为什么要写博客
- Hadoop中mapReduce处理过程详解
- openGL之glsl入门1--基本概念
- windows使用nvm管理nodejs版本,安装nvm
- Java学习笔记:EL表达式
- 常用蓝牙UUID
- IOS分页控制器