Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 【Android】GreenDao 3.X 結合Volley以及Gson、ImageLoader實現數據存儲

【Android】GreenDao 3.X 結合Volley以及Gson、ImageLoader實現數據存儲

編輯:關於Android編程

關於GreenDao的優點已經不用再說了,關於第三方數據庫框架有很多,相對於Android系統本身的SQLite以及其它第三方而言,我感覺GreenDao使用更方便,體積小、速度更快。網上大多是關於GreenDao之前版本的介紹,關於3.0+新版的介紹不多。GreenDao新版改動還是挺大的,之前版本使用起來比較復雜,需要新建項目,然後再項目中配置各個實體的字段等相關屬性,然後生成實體以及DAO操作相關的一些類。而GreenDao3.0及其以後是通過注解的方式定義實體類,並且是通過插件來生成相應代碼。
先來張效果圖
這裡寫圖片描述vc7Esb7X1rbOo6zNvMasz+C21MLpt7O+zcO709Cxo7Tmo6zV/cq9v6q3orXEu7DKx7GjtOa1vbu6tObW0LXEoaM8L3A+DQo8aDQgaWQ9"下面還是說下怎麼使用新版greendao3x-吧先給出官網github地址httpsgithubcomgreenrobotgreendao">下面還是說下怎麼使用新版GreenDao3.X 吧,先給出官網github地址:https://github.com/greenrobot/greenDAO

首先我們需要在Gradle中添加如下配置

apply plugin: ‘org.greenrobot.greendao’
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ‘org.greenrobot:greendao-gradle-plugin:3.0.0’
}
}
dependencies {
compile ‘org.greenrobot:greendao:3.0.0’
}

最新版本是3.2.0,這裡說下為什麼我沒用3.2.0版本,因為使用此版本編譯一直報可奇怪的錯,這裡選用3.0.0也一樣,主要就是為了說明跟之前2.X版本的區別。其中,我們看到classpath ‘org.greenrobot:greendao-gradle-plugin:3.0.0’這是添加插件的,用插件生成我們的相應代碼用的。

同時,我們還可以配置當插件根據我們所定義的實體類自動生成的DaoMaster、DaoSession以及實體類相對應的XXXDAO類文件的存放目錄。

greendao {
    schemaVersion 1
    daoPackage 'com.example.testproject.greendao.gen'
    targetGenDir 'src/main/java'
}

說明:schemaVersion:表示指定數據庫schema版本號,如果需要數據庫升級,可以在這裡修改數據庫最新版本號。 daoPackage:表示生成的這些類文件在哪個包下面(默認為你的entity所在的包名)。 targetGenDir:就是上面所說的制定這些類文件所在的目錄,這裡我們設置跟我們代碼目錄相同,都是在java目錄中,方便查看。

我們接下來寫我們的實體類(ProductBean),這些實體類中的字段是要寫進數據庫的,就相當於一張表(ProductBean表)。寫完之後我們選擇Build–>Make Project,剩下的就交給插件了,就會自動幫我們生成(每次修改字段啥的,不要忘記Build–>Make Project), 如下圖所示:

這裡寫圖片描述

/**
 * 實體類,存儲到數據庫
 */
@Entity
public class ProductBean {
    private Long id;
    @Property(nameInDb = "url")
    private String picUrl;
    @Property(nameInDb = "title")
    private String proTitle;
    @Property(nameInDb = "info")
    private String proInfo;
    @Property(nameInDb = "proId")
    @Id
    private Long proId;
}    

這裡有幾點需要注意:GreenDao3.X 要求主鍵必須是Long或者long類型的。這裡由於接口請求的數據中含有一個id,所以我就用這個id作為主鍵,當然這個id是String類型的,需要轉換下。@Id:表示作為主鍵 @Property(nameInDb = “url”):表示該字段在數據庫中的字段名稱,還有很多屬性,大家可以到官網上去了解,最後別忘了在定義實體類上面要加上@Entity因為插件要根據它生成相應的DAO。定義的有些字段是沒用到的,大家測試的時候也可以自行刪除。

GreenDao3.X 配置完了,接下來就是撸代碼了。官方推薦將DaoMaster 對象的方法放到 Application 層,這樣將避免多次創建生成 Session 對象。下面看下我們的application

/**
 * 自定義MyApplication
 */
public class MyApplication extends Application {

    private static MyApplication myApplication;
    public RequestQueue requestQueue;

    private static DaoMaster daoMaster;
    private static DaoSession daoSession;

    @Override
    public void onCreate() {
        super.onCreate();
        myApplication = this;
        //創建隊列
        requestQueue = Volley.newRequestQueue(this);
    }

    public static DaoMaster getDaoMaster(Context context){
        if(daoMaster == null){
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context,"mydata-db",null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    public static DaoSession getDaoSession(Context context){
        if(daoSession == null){
            if(daoMaster == null){
                daoMaster = getDaoMaster(context);
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    public static MyApplication getApplication() {
        return myApplication;
    }
}

關於增、刪、改、查,這些就比較簡單了。這裡簡單說下,首先,我們先獲取DaoSession,從而來操作數據庫。

ProductBeanDao dao = MyApplication.getDaoSession(MainActivity.this).getProductBeanDao();

1. 插入(批量添加時屬於耗時操作,GreenDao提供的有runInTx()方法)

ProductBean productBean = new ProductBean(null,null,productData.getName(),productData.getInfo(),Long.parseLong(productData.getId()));

dao.insert(productBean);
//dao.insertOrReplace(productBean);

//批量添加的情況(注意try的位置)
final List lists = new ArrayList();
for(int i=0;i<20;i++){
    ProductBean productBean = new ProductBean();
    productBean.setProTitle(xxxx);
    productBean.setProInfo(xxxx);
    lists.add(productBean);
    }   
try {
      MyApplication.getDaoSession(MainActivity.this).runInTx(new Runnable() {
      @Override
      public void run() {
      for(ProductBean bean : lists){  
         MyApplication.getDaoSession(MainActivity.this).insertOrReplace(bean);                                    
        }
     }
   });
 }catch (Exception e){
         e.printStackTrace();
 }

2. 刪除(刪之前要先查一下,刪除的方法有很多,可以刪單條數據,也可以全部刪除等等)

ProductBean bean = dao.queryBuilder().where(ProductBeanDao.Properties.ProTitle.eq("中青年抗癌互助計劃")).build().unique();
                    if(bean != null){
                        dao.delete(bean);
                    }

3. 修改

ProductBean bean = dao.queryBuilder().where(ProductBeanDao.Properties.ProTitle.eq("中青年抗癌互助計劃")).build().unique();
if(bean != null){
      bean.setProTitle("修改title");
      dao.update(bean);
     }

4. 查詢(可以寫多個查詢條件where,可以設置升序(orderAsc)、降序排列,limit:限制用於顯示查詢數據的數量,這裡只要求顯示3條數據,list():表示查詢結果為一個集合, 當然了,還可以查單條數據unique())

List lists = dao.queryBuilder()
                            .where(ProductBeanDao.Properties.ProId.eq(3))
                            .where(.......)
                            .orderAsc(ProductBeanDao.Properties.ProId)
                            .limit(3)
                            .build().list();

最後看下MainActivity的全部代碼(這裡我沒有采用id自增長的方式(不然數據會添加重復數據),而是用返回數據中的id作為主鍵,並且采用dao.insertOrReplace(productBean)的方式防止重復添加,不能使用dao.insert(),因為主鍵不可重復,這樣當再次點擊按鈕添加重復的數據就會報錯。僅是測試,情景不同,具體情況具體對待)

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ProductAdapter adapter;
    private List<listprobean> lists;
    private Button btnRequest;
    private static final  String url = "http://test.xinlechou.com/index.php?r=api/insuranceList";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        iniViews();
        getRequestDatas();
    }

    private void iniViews() {
        listView = (ListView) findViewById(R.id.listView);
        btnRequest = (Button) findViewById(R.id.btn_request);
    }

    public void getRequestDatas() {
        btnRequest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //數據庫
                final ProductBeanDao dao = MyApplication.getDaoSession(MainActivity.this).getProductBeanDao();
                if(NetUtil.isNetConnected(MainActivity.this)){
                    //volley請求數據
                    StringRequest request = new StringRequest(url, new Response.Listener<string>() {
                        @Override
                        public void onResponse(String response) {
                            Gson gson = new Gson();
                            ListProBean bean = gson.fromJson(response,ListProBean.class);
                            if(bean.getError() == 0){
                                ArrayList<productdata> datas = bean.getData();
                                adapter = new ProductAdapter(MainActivity.this,datas);
                                listView.setAdapter(adapter);
                                //將數據保存到greendao數據庫
                                for(int i=0;i<datas.size();i++){ productdata="" productbean="" boolean="" flag="dao.insert(productBean)" true="" :="" new="" override="" public="" void="" volleyerror=""> lists = dao.queryBuilder().build().list();
                    if(lists != null && lists.size() > 0){
                        Toast.makeText(MainActivity.this,"從數據庫中讀取數據",Toast.LENGTH_SHORT).show();
                        List<productdata> productDatas = new ArrayList<productdata>();
                        for(int i=0;i<lists.size();i++){ productbean="" string="" title="productBean.getProTitle();" info="productBean.getProInfo();" productdata="" adapter="new" pre="">

希望能對大家有所幫助,隨後會把全部代碼上傳,如果發現講述的有問題,歡迎指出

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved