1,最近看了一篇文章關於GreenDao的文章 ,感覺使用這個操作數據庫還是很好用的,幫我們省了不少的查詢代碼,今天就和大家一起來簡單的使用一下吧。首先這是官網地址:https://github.com/greenrobot/greendao,我們來按照文檔一點點的來寫一下
2,首先要認識一下GreenDao是使用ORM(Object RelationShop Mapping)對象關系映射,就是通過GreenDao將數據庫和Bean關聯起來有以下優點:
-
存取速度快
-
支持數據庫加密
-
輕量級
-
激活實體
-
支持緩存
-
代碼自動生成
3,接入,首先要在Project中的build中添加如下代碼
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
再在Module中的build添加引用
apply plugin: 'com.android.application' //使用greendao apply plugin: 'org.greenrobot.greendao' android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.qianmo.greendaotest" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } //greendao配置 greendao { //版本號,升級時可配置 schemaVersion 1 // daoPackage 'com.qianmo.greendaotest.gen' // targetGenDir 'src/main/java' } 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.1.1' compile 'com.android.support:design:25.1.1' compile 'org.greenrobot:greendao:3.2.0' //greendao依賴 testCompile 'junit:junit:4.12' }
這樣就配置成功了,接着是簡單的使用。
4,使用,先來看一下我們的效果圖
①創建ShopBean
package com.qianmo.greendaotest.bean; import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Id; import org.greenrobot.greendao.annotation.Property; import org.greenrobot.greendao.annotation.Unique; import org.greenrobot.greendao.annotation.Generated; /** * Created by wangjitao on 2017/2/13 0013. * E-Mail:543441727@qq.com * * Bean 對象注釋的解釋 * * @Entity:告訴GreenDao該對象為實體,只有被@Entity注釋的Bean類才能被dao類操作 @Id:對象的Id,使用Long類型作為EntityId,否則會報錯。(autoincrement = true)表示主鍵會自增,如果false就會使用舊值 @Property:可以自定義字段名,注意外鍵不能使用該屬性 @NotNull:屬性不能為空 @Transient:使用該注釋的屬性不會被存入數據庫的字段中 @Unique:該屬性值必須在數據庫中是唯一值 @Generated:編譯后自動生成的構造函數、方法等的注釋,提示構造函數、方法等不能被修改 */ @Entity public class Shop { //表示是購物車列表 public static final int TYPE_CART = 0x01; //表示為收藏列表 public static final int TYPE_LOVE = 0x02; //不能用int (ID 表示標識主鍵 且主鍵不能用int autoincrement = true 表示主鍵會自增) @Id(autoincrement = true) private Long id; //商品名稱 (unique 表示該屬性必須在數據庫中是唯一的值) @Unique private String name; //商品價格(可以自定義字段名,注意外鍵不能使用該屬性) @Property(nameInDb = "price") private String price; //已售數量 private int sell_num; //圖標url private String image_url; //商家地址 private String address; //商品列表分類 private int type; @Generated(hash = 1304458862) public Shop(Long id, String name, String price, int sell_num, String image_url, String address, int type) { this.id = id; this.name = name; this.price = price; this.sell_num = sell_num; this.image_url = image_url; this.address = address; this.type = type; } @Generated(hash = 633476670) public Shop() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getPrice() { return this.price; } public void setPrice(String price) { this.price = price; } public int getSell_num() { return this.sell_num; } public void setSell_num(int sell_num) { this.sell_num = sell_num; } public String getImage_url() { return this.image_url; } public void setImage_url(String image_url) { this.image_url = image_url; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } public int getType() { return this.type; } public void setType(int type) { this.type = type; } }
對Bean中的對象進行解釋
- @Entity:告訴GreenDao該對象為實體,只有被@Entity注釋的Bean類才能被dao類操作
- @Id:對象的Id,使用Long類型作為EntityId,否則會報錯。(autoincrement = true)表示主鍵會自增,如果false就會使用舊值
- @Property:可以自定義字段名,注意外鍵不能使用該屬性
- @NotNull:屬性不能為空
- @Transient:使用該注釋的屬性不會被存入數據庫的字段中
- @Unique:該屬性值必須在數據庫中是唯一值
- @Generated:編譯后自動生成的構造函數、方法等的注釋,提示構造函數、方法等不能被修改
②創建數據庫名稱
package com.qianmo.greendaotest; import android.app.Application; import android.database.sqlite.SQLiteDatabase; import com.qianmo.greendaotest.bean.DaoMaster; import com.qianmo.greendaotest.bean.DaoSession; /** * Created by wangjitao on 2017/2/13 0013. * E-Mail:543441727@qq.com */ public class BaseApplication extends Application { private static DaoSession daoSession; @Override public void onCreate() { super.onCreate(); //配置數據庫 setupDatabase(); } /** * 配置數據庫 */ private void setupDatabase() { //創建數據庫shop.db DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "shop.db", null); //獲取可寫數據庫 SQLiteDatabase db = helper.getWritableDatabase(); //獲取數據庫對象 DaoMaster daoMaster = new DaoMaster(db); //獲取dao對象管理者 daoSession = daoMaster.newSession(); } public static DaoSession getDaoInstant() { return daoSession; } }
這里我們需要創建一個Application,在代碼中初始化數據庫的基本數據,這里要講解這下面這三個類
-
DevOpenHelper:創建SQLite數據庫的SQLiteOpenHelper的具體實現
-
DaoMaster:GreenDao的頂級對象,作為數據庫對象、用於創建表和刪除表
-
DaoSession:管理所有的Dao對象,Dao對象中存在着增刪改查等API
這里注意一下我們要編譯一下我們的工程(ctrl+F9),因為上面三個類是運行時創建的,還有相應的Shop中的set和get方法及構造函數
③添加一個Dao,提供簡單的Shop對象的增刪該查的簡單方法
package com.qianmo.greendaotest.dao; import com.qianmo.greendaotest.BaseApplication; import com.qianmo.greendaotest.bean.Shop; import com.qianmo.greendaotest.bean.ShopDao; import java.util.List; /** * Created by wangjitao on 2017/2/13 0013. * E-Mail:543441727@qq.com * 使用GreenDao 實現簡單的增刪改查,下面是基本方法 * 增加單個數據 * getShopDao().insert(shop); * getShopDao().insertOrReplace(shop); * 增加多個數據 * getShopDao().insertInTx(shopList); * getShopDao().insertOrReplaceInTx(shopList); * 查詢全部 * List< Shop> list = getShopDao().loadAll(); * List< Shop> list = getShopDao().queryBuilder().list(); * 查詢附加單個條件 * .where() * .whereOr() * 查詢附加多個條件 * .where(, , ,) * .whereOr(, , ,) * 查詢附加排序 * .orderDesc() * .orderAsc() * 查詢限制當頁個數 * .limit() * 查詢總個數 * .count() * 修改單個數據 * getShopDao().update(shop); * 修改多個數據 * getShopDao().updateInTx(shopList); * 刪除單個數據 * getTABUserDao().delete(user); * 刪除多個數據 * getUserDao().deleteInTx(userList); * 刪除數據ByKey * getTABUserDao().deleteByKey(); */ public class ShopDao { /** * 添加數據,如果有重復則覆蓋 * * @param shop */ public static void insertShop(Shop shop) { BaseApplication.getDaoInstant().getShopDao().insertOrReplace(shop); } /** * 刪除數據 * * @param id */ public static void deleteShop(long id) { BaseApplication.getDaoInstant().getShopDao().deleteByKey(id); } /** * 更新數據 */ public static void updateShop(Shop shop) { BaseApplication.getDaoInstant().getShopDao().update(shop); } /** * 查詢Type為1的所有數據 * * @return */ public static List<Shop> queryShop() { return BaseApplication.getDaoInstant().getShopDao().queryBuilder().where(ShopDao.Properties.Type.eq(Shop.TYPE_CART)).list(); } /** * 查詢所有數據 * * @return */ public static List<Shop> queryAll() { return BaseApplication.getDaoInstant().getShopDao().loadAll(); } }
Dao中其它的一些方法
-
增加單個數據
-
getShopDao().insert(shop);
-
getShopDao().insertOrReplace(shop);
-
增加多個數據
-
getShopDao().insertInTx(shopList);
-
getShopDao().insertOrReplaceInTx(shopList);
-
查詢全部
-
List< Shop> list = getShopDao().loadAll();
-
List< Shop> list = getShopDao().queryBuilder().list();
-
查詢附加單個條件
-
.where()
-
.whereOr()
-
查詢附加多個條件
-
.where(, , ,)
-
.whereOr(, , ,)
-
查詢附加排序
-
.orderDesc()
-
.orderAsc()
-
查詢限制當頁個數
-
.limit()
-
查詢總個數
-
.count()
-
修改單個數據
-
getShopDao().update(shop);
-
修改多個數據
-
getShopDao().updateInTx(shopList);
-
刪除單個數據
-
getTABUserDao().delete(user);
-
刪除多個數據
-
getUserDao().deleteInTx(userList);
-
刪除數據ByKey
-
getTABUserDao().deleteByKey();
④這樣我們就基本上完成了,這里我們寫一個界面來展示一下吧
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.qianmo.greendaotest.MainActivity" tools:showIn="@layout/activity_main"> <LinearLayout android:id="@+id/ll_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:text="增加"/> <Button android:id="@+id/btn_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:text="刪除"/> <Button android:id="@+id/btn_edit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:text="修改"/> <Button android:id="@+id/btn_query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:text="查詢"/> </LinearLayout> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/ll_btn"> </ListView> </RelativeLayout>
MainActivity.java
package com.qianmo.greendaotest; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.Button; import android.widget.ListView; import com.qianmo.greendaotest.adapter.ShopListAdapter; import com.qianmo.greendaotest.bean.Shop; import com.qianmo.greendaotest.dao.LoveDao; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_add; private Button btn_edit; private Button btn_delete; private Button btn_query; private ListView listView; private List<Shop> shops; private ShopListAdapter adapter; private int i; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); initView(); initData(); } private void initData() { shops = new ArrayList<>(); shops = LoveDao.queryShop(); adapter = new ShopListAdapter(this, shops); listView.setAdapter(adapter); } private void initView() { btn_add = (Button) findViewById(R.id.btn_add); btn_edit = (Button) findViewById(R.id.btn_edit); btn_delete = (Button) findViewById(R.id.btn_delete); btn_query = (Button) findViewById(R.id.btn_query); listView = (ListView) findViewById(R.id.listView); btn_add.setOnClickListener(this); btn_edit.setOnClickListener(this); btn_delete.setOnClickListener(this); btn_query.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private void addDate() { Shop shop = new Shop(); shop.setType(Shop.TYPE_CART); shop.setAddress("廣東深圳"); shop.setImage_url("https://img.alicdn.com/bao/uploaded/i2/TB1N4V2PXXXXXa.XFXXXXXXXXXX_!!0-item_pic.jpg_640x640q50.jpg"); shop.setPrice("19.40"); shop.setSell_num(15263); shop.setName("正宗梅菜扣肉 聰廚梅干菜扣肉 家宴常備方便菜虎皮紅燒肉 2盒包郵" + i++); LoveDao.insertShop(shop); initData(); } private void updateDate() { if (!shops.isEmpty()) { Shop shop = shops.get(0); shop.setName("我是修改的名字"); LoveDao.updateShop(shop); initData(); } } private void deleteDate() { if (!shops.isEmpty()) { LoveDao.deleteShop(shops.get(0).getId()); initData(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_add: addDate(); break; case R.id.btn_edit: updateDate(); break; case R.id.btn_delete: deleteDate(); break; case R.id.listView: initData(); break; } } }
Adapter
package com.qianmo.greendaotest.adapter; import android.content.Context; import android.graphics.Paint; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.qianmo.greendaotest.R; import com.qianmo.greendaotest.bean.Shop; import java.util.List; import static android.R.id.list; /** * Created by Administrator on 2017/2/13 0013. * E-Mail:543441727@qq.com */ public class ShopListAdapter extends BaseAdapter { private Context context; private List<Shop> datas; private LayoutInflater mInflater; public ShopListAdapter(Context context, List<Shop> datas) { this.context = context; this.datas = datas; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return datas.size(); } @Override public Object getItem(int position) { return datas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.adapter_shop_list, null); } ViewHolder holder = getViewHolder(convertView); Shop shop = datas.get(position); holder.iv_shop.setImageResource(R.mipmap.ic_launcher); holder.tv_name.setText(shop.getName()); holder.tv_price.setText(shop.getPrice() + ""); holder.tv_price_discount.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG); holder.tv_sell_num.setText("已售" + shop.getSell_num() + "件"); return convertView; } /** * 獲得控件管理對象 * * @param view * @return */ private ViewHolder getViewHolder(View view) { ViewHolder holder = (ViewHolder) view.getTag(); if (holder == null) { holder = new ViewHolder(view); view.setTag(holder); } return holder; } /** * 控件管理類 */ private class ViewHolder { private TextView tv_name, tv_price, tv_price_discount, tv_sell_num; private ImageView iv_shop; ViewHolder(View view) { tv_name = (TextView) view.findViewById(R.id.tv_name); tv_price = (TextView) view.findViewById(R.id.tv_price); tv_price_discount = (TextView) view.findViewById(R.id.tv_price_discount); tv_sell_num = (TextView) view.findViewById(R.id.tv_sell_num); iv_shop = (ImageView) view.findViewById(R.id.iv_shop); } } }
ok,這樣我們就完成了,看一下效果
See you next time!