作为一个只会踢球的小白菜,在客户端一直使用的是SQLite数据库,觉得还不错,不算太复杂。一次偶然的机会,在和别人的交谈中了解到了greenDAO数据库框架。当时是一脸懵的状态,然后百度了一下发现,它应该算是当前最火的数据库开源框架了,它是一个将对象映射到SQLite数据库中的轻量且快速的ORM(object / relational mapping)解决方案。最主要的是它的代码量少了许多,再也不用手动编码啦
了解过greenDAO之后,内心抑制不住激动地小手手,就赶紧码了一个简单的增删改查功能。给各位大佬奉上
GitHub地址:https://github.com/cctxwan/greenDAO_Demo
CSDN地址:https://download.csdn.net/download/qq_35840038/11018960
看完效果之后,就该进入到正式得配置和编码中啦,首先需要配置。很简单,如下:
//在项目build里面的dependencies里添加这行
//添加greenDAO
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
然后在moudle的build里面添加这行
//添加greenDAO
apply plugin: 'org.greenrobot.greendao' // apply plugin
greendao{
schemaVersion 1
daoPackage 'com.cc.greendao_demo.cc'
targetGenDir 'src/main/java'
}
//添加greenDAO
implementation 'org.greenrobot:greendao:3.2.2' // add library
配置完成之后设置实体类:
package com.cc.greendao_demo.model;
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
/**
* 实体类
*/
@Entity
public class UserInfo {
/** id(主键,自增。千万要注意,不能用int) */
@Id(autoincrement = true)
private Long id;
/** 姓名(不可为空) */
private String name;
/** 电话(可以为空) */
private String phonenum;
}
生成的三个类分别是:
application.class:
package com.cc.greendao_demo.db;
import android.app.Application;
import android.database.sqlite.SQLiteDatabase;
import com.cc.greendao_demo.cc.DaoMaster;
import com.cc.greendao_demo.cc.DaoSession;
/**
* 官方要求需要写到Application里面
*/
public class MyApplication extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
public static MyApplication instances;
@Override
public void onCreate() {
super.onCreate();
instances = this;
setDatabase();
}
public static MyApplication getInstances(){
return instances;
}
/**
* 设置greenDAO
*/
private void setDatabase() {
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "cc-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
public SQLiteDatabase getDb() {
return db;
}
}
代码如下:
activity.class:
package com.cc.greendao_demo.activity;
import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import com.cc.greendao_demo.adapter.ListViewAdapter;
import com.cc.greendao_demo.cc.DaoMaster;
import com.cc.greendao_demo.cc.DaoSession;
import com.cc.greendao_demo.cc.UserInfoDao;
import com.cc.greendao_demo.db.MyApplication;
import com.cc.greendao_demo.model.UserInfo;
import java.util.ArrayList;
import java.util.List;
/**
* greenDao的增删改查
* @author 财财
* @version 2019年3月13日14:08:00
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener {
Activity activity = MainActivity.this;
ListView listView;
Button bt1;
List datas = new ArrayList<>();
ListViewAdapter listViewAdapter;
UserInfoDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取数据库操作dao
dao = MyApplication.getInstances().getDaoSession().getUserInfoDao();
initView();
initData();
}
private void initData() {
//查询所有的数据
datas = dao.queryBuilder().build().list();
//使用adapter显示到listview中
listViewAdapter = new ListViewAdapter(activity, datas);
//绑定
listView.setAdapter(listViewAdapter);
//点击事件
listView.setOnItemClickListener(this);
//长按事件
listView.setOnItemLongClickListener(this);
}
private void initView() {
listView = findViewById(R.id.listview);
bt1 = findViewById(R.id.button1);
bt1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int temdId = v.getId();
if(temdId == R.id.button1){
//添加数据
dao.insert(new UserInfo(null, "张三", "15698512368"));
dao.insert(new UserInfo(null, "李四", "15698512368"));
dao.insert(new UserInfo(null, "王五", "15698512368"));
dao.insert(new UserInfo(null, "赵六", "15698512368"));
dao.insert(new UserInfo(null, "刘七", "15698512368"));
dao.insert(new UserInfo(null, "曹八", "15698512368"));
dao.insert(new UserInfo(null, "苏九", "15698512368"));
dao.insert(new UserInfo(null, "寇十", "15698512368"));
dao.insert(new UserInfo(null, "陈一", "15698512368"));
dao.insert(new UserInfo(null, "庄二", "15698512368"));
notifyListView();
}
}
/**
* 跟新ListView,不知为啥adapter.notifyDataSetChanged()没反应
*/
public void notifyListView(){
//先清空集合里面的数据
datas.clear();
//重新赋值
datas = dao.loadAll();
//重新绑定
listViewAdapter = new ListViewAdapter(MainActivity.this, datas);
listView.setAdapter(listViewAdapter);
}
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Log.d("TAG", "单击事件");
//修改数据不能相同,否则会报错
dao.update(new UserInfo(datas.get(position).getId(), datas.get(position).getName() + "我被修改啦", datas.get(position).getPhonenum()));
//刷新数据
notifyListView();
}
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
Log.d("TAG", "长按事件");
//根据对应的id删掉该列数据
dao.deleteByKey(datas.get(position).getId());
//刷新数据
notifyListView();
return true;
}
}
注:代码在这里就全部结束啦
GitHub地址:https://github.com/cctxwan/greenDAO_Demo
CSDN地址:https://download.csdn.net/download/qq_35840038/11018960
q:486789970
email:[email protected]
---财财亲笔