GreenDao是android数据库开发目前比较流行的ORM框架,一些概念就不说了,网上都有的,今天在这里主要写一下它的用法。
1、首先去网站https://github.com/greenrobot/greenDAO上下载示例工程,建立java工程,生成DaoMaster,Daosession,...Dao,...Entity。代码如下:
public class GreenDaoTest {
public static void main(String[] args) throws Exception {
//数据库版本号是1,liyang.com.myapptest.daos是最后Dao生成的包路径
//这里最好和项目里面的包一致,这样省得麻烦
Schema schema = new Schema(1, "liyang.com.myapptest.daos");
addCities(schema);
addPortAndCabinet(schema);
//generate all daos,F:/greenDaoProduct是生成的文件所在目录
new DaoGenerator().generateAll(schema, "F:/greenDaoProduct");
}
private static void addCities(Schema schema) {
Entity city = schema.addEntity("CityEntity");
city.addIdProperty();
city.addStringProperty("name");
city.addIntProperty("level");
city.addStringProperty("pingyin");
}
private static void addPortAndCabinet(Schema schema) {
Entity customer = schema.addEntity("Customer");
customer.addIdProperty();
customer.addStringProperty("name").notNull();
Entity order = schema.addEntity("Order");
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
order.addIdProperty();
Property orderDate = order.addDateProperty("date").getProperty();
Property customerId = order.addLongProperty("customerId").notNull().getProperty();
order.addToOne(customer, customerId);
ToMany customerToOrders = customer.addToMany(order, customerId);
customerToOrders.setName("orders");
customerToOrders.orderAsc(orderDate);
}
}
这里主要生成三张表,第一张是城市表,第二张是顾客表,第三张是订单表。顾客和订单是一对多的关系,通过在订单表里面加上外键
Property customerId = order.addLongProperty("customerId").notNull().getProperty();然后通过
order.addToOne(customer, customerId);
ToMany customerToOrders = customer.addToMany(order, customerId);
两句话确定一对多关系。这样如果有一条顾客记录,这位顾客有多个订单,那么就可以通过getOrders()获取她的所有订单了,非常方便,当然也可以通过getCustomer()获取一个订单的所属顾客。
运行该段代码后如果没什么问题就会如下图所示:
然后在F:/greenDaoProduct里面在liyang.com.myapptest.daos包下面会生成Dao类等文件如下图
2、建立android工程,然后把上图里面的几个java文件放到对于的包下面,记得包名要一样啊,不然还要改,如下图
然后再建立两个数据库操作公共类DBUtil和DBUtilBase,代码如下:
public class DBUtilBase {
private DaoSession daoSession = null;
private DaoMaster daoMaster = null;
public static String DB_NAME = "/sdcard/myapp_test.db";//数据库建立在sdcard上面,名字叫myapp_test.db
private static DBUtilBase singleDB = new DBUtilBase();
//私有默认构造子
private DBUtilBase(){
}
// 静态工厂方法
public static DBUtilBase getInstance(){
return singleDB;
}
public DaoMaster getDaoMaster(Context context){
if(daoMaster == null){
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
SQLiteDatabase db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
}
return daoMaster;
}
public DaoSession getDaoSession(Context context){
if(daoSession == null){
daoSession = getDaoMaster(context).newSession();
}
return daoSession;
}
}
然后建立DBUtil类,主要实现操作数据库的具体方法,主要是对三张表的增删改查
public class DBUtil {
private static DBUtil singleDB=null;
private DaoSession daoSession=null;
private CityEntityDao cityEntityDao=null;
private CustomerDao customerDao=null;
private OrderDao orderDao=null;
private DBUtil(Context context){
daoSession=DBUtilBase.getInstance().getDaoSession(context);
cityEntityDao=daoSession.getCityEntityDao();
customerDao=daoSession.getCustomerDao();
orderDao=daoSession.getOrderDao();
}
public static DBUtil getDbInstance(Context context){
if (singleDB==null){
singleDB=new DBUtil(context);
}
return singleDB;
}
public void insertCity(CityEntity cityEntity){
if (cityEntity!=null){
cityEntityDao.insert(cityEntity);
}
}
public void deleteCity(CityEntity cityEntity){
if (cityEntity!=null){
cityEntityDao.delete(cityEntity);
}
}
public void updateCity(CityEntity cityEntity){
if (cityEntity!=null){
cityEntityDao.update(cityEntity);
}
}
public List<CityEntity> getAllCity(){
return cityEntityDao.loadAll();
}
public CityEntity getCityByPrimaryKey(long id){
return cityEntityDao.load(id);
}
public List<CityEntity> getCityByLevel(int level){
if (level<0)
return null;
String where = "WHERE "+CityEntityDao.Properties.Level.columnName+" =?";
List<CityEntity> cityEntities=cityEntityDao.queryRaw(where,level+"");
if (cityEntities==null)
return null;
return cityEntities;
}
///
public void insertCustomer(Customer customer){
if (customer!=null){
customerDao.insert(customer);
}
}
public void deleteCustomer(Customer customer){
if (customer!=null){
customerDao.delete(customer);
}
}
public void updateCustomer(Customer customer){
if (customer!=null){
customerDao.update(customer);
}
}
public List<Customer> getAllCustomers(){
return customerDao.loadAll();
}
//
public void insertOrder(Order order){
if (order!=null){
orderDao.insert(order);
}
}
public void deleteOrder(Order order){
if (order!=null){
orderDao.delete(order);
}
}
public void updateOrder(Order order){
if (order!=null){
orderDao.update(order);
}
}
public List<Order> getAllOrderS(){
return orderDao.loadAll();
}
}
下面建立一个Activity,主要测试使用数据库,代码如下:
public class GreenDaoTestActivity extends ActionBarActivity {
private DBUtil db;
private Context ctx;
private TextView showText=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_green_dao_test);
ctx=this;
db=DBUtil.getDbInstance(ctx);
showText=(TextView)findViewById(R.id.show_data_text);
}
public void showData(View view){
List<CityEntity> cities= db.getAllCity();
String cityStr="";
for(CityEntity cityEntity:cities){
cityStr+=cityEntity.getId()+" "+cityEntity.getName()+" "+cityEntity.getLevel()+" "+cityEntity.getPingyin()+"\n";
}
showText.setText(cityStr);
}
public void insertDataBtn(View view){
CityEntity city=new CityEntity();
city.setName("苏州");
city.setLevel(1);
city.setPingyin("suzhou");
db.insertCity(city);
showData(view);
}
public void deleteDataBtn(View view){
List<CityEntity> cities= db.getAllCity();
CityEntity city=cities.get(cities.size()-1);
db.deleteCity(city);
showData(view);
}
public void updateDataBtn(View view){
List<CityEntity> cities= db.getAllCity();
CityEntity city=cities.get(cities.size()-1);
city.setName("上海");
city.setPingyin("shangai");
city.setLevel(0);
db.updateCity(city);
showData(view);
}
public void selectLevelCities(View view){
List<CityEntity> cities=db.getCityByLevel(0);
String cityStr="";
for(CityEntity cityEntity:cities){
cityStr+=cityEntity.getId()+" "+cityEntity.getName()+" "+cityEntity.getLevel()+" "+cityEntity.getPingyin()+"\n";
}
showText.setText(cityStr);
}
public void selectIdCity(View view){
CityEntity cityEntity=db.getCityByPrimaryKey(2);
String cityStr=cityEntity.getId()+" "+cityEntity.getName()+" "+cityEntity.getLevel()+" "+cityEntity.getPingyin();
showText.setText(cityStr);
}
public void showCustomerData(View view){
List<Customer> customers=db.getAllCustomers();
String str="";
for(Customer customer:customers){
str+=customer.getId()+" "+customer.getName()+"\n";
}
showText.setText(str);
}
public void insertCustomer(View view){
Customer customer=new Customer();
customer.setName("小李");
db.insertCustomer(customer);
showCustomerData(view);
}
public void deleteCustomer(View view){
List<Customer> customers=db.getAllCustomers();
Customer customer=customers.get(customers.size()-1);
db.deleteCustomer(customer);
showCustomerData(view);
}
public void updateCustomer(View view){
List<Customer> customers=db.getAllCustomers();
Customer customer=customers.get(customers.size()-1);
customer.setName("小王");
db.updateCustomer(customer);
showCustomerData(view);
}
public void getOrdersBelongCustomer(View view){
List<Customer> customers=db.getAllCustomers();
Customer customer=customers.get(customers.size()-1);
List<Order> orders=customer.getOrders();
String str="";
for(Order order:orders){
str+=order.getId()+" "+order.getCustomerId()+" "+order.getDate().toString()+"\n";
}
showText.setText(str);
}
//
public void showOrderData(View view){
List<Order> orders=db.getAllOrderS();
String str="";
for(Order order:orders){
str+=order.getId()+" "+order.getCustomerId()+" "+order.getDate().toString()+"\n";
}
showText.setText(str);
}
public void insertOrder(View view){
Order order=new Order();
order.setCustomerId(2);
order.setDate(new Date());
db.insertOrder(order);
showOrderData(view);
}
public void deleteOrder(View view){
List<Order> orders=db.getAllOrderS();
Order order=orders.get(orders.size()-1);
db.deleteOrder(order);
showOrderData(view);
}
public void updateOrder(View view){
List<Order> orders=db.getAllOrderS();
Order order=orders.get(orders.size()-1);
order.setCustomerId(3);
db.updateOrder(order);
showOrderData(view);
}
public void selectCustomerByOrder(View view){
List<Order> orders=db.getAllOrderS();
Order order=orders.get(0);
Customer customer=order.getCustomer();
String str=customer.getId()+" "+customer.getName();
showText.setText(str);
}
}
布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context="liyang.com.myapptest.GreenDaoTestActivity">
<TextView
android:id="@+id/show_data_text"
android:text="数据显示区域"
android:textColor="#000000"
android:gravity="center"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:gravity="center_horizontal"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_marginTop="20dp"
android:onClick="showData"
android:text="显示所有城市"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:text="插入城市"
android:onClick="insertDataBtn"
android:layout_width="100dp"
android:layout_height="40dp" />
<Button
android:onClick="deleteDataBtn"
android:text="删除城市"
android:layout_width="100dp"
android:layout_height="40dp" />
<Button
android:onClick="updateDataBtn"
android:text="修改城市"
android:layout_width="100dp"
android:layout_height="40dp" />
<Button
android:onClick="selectLevelCities"
android:text="查询level为0的城市"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="selectIdCity"
android:text="查询id为2的城市"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="showCustomerData"
android:text="显示所有消费者"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="insertCustomer"
android:text="插入消费者"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="deleteCustomer"
android:text="删除消费者"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="updateCustomer"
android:text="更新消费者"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="getOrdersBelongCustomer"
android:text="获取最后一个消费者所有的订单"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="showOrderData"
android:text="显示所有订单"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="insertOrder"
android:text="插入订单"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="deleteOrder"
android:text="删除订单"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="updateOrder"
android:text="更新订单"
android:layout_width="wrap_content"
android:layout_height="40dp" />
<Button
android:onClick="selectCustomerByOrder"
android:text="获取第一个订单所属的消费者"
android:layout_width="wrap_content"
android:layout_height="40dp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
在Manifest.xml里面记得加入权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在gradle里面加入compile 'de.greenrobot:greendao:2.0.0'导入greenDao包
测试的一些效果图如下: