代码已上传 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