一:什么是GreenDao

1.官网地址:https://github.com/greenrobot/greenDAO

2.greenDAO通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),可以使用简单的面向对象API来存储、更新、删除和查询Java对象。

二:效果

三:GreenDao使用
1.在项目中的整体build.gradle使用添加依赖

buildscript {repositories {jcenter()mavenCentral() // add repository}dependencies {classpath 'com.android.tools.build:gradle:3.5.3'classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin}
}

2:在app/build.gradle中添加依赖

apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugindependencies {implementation 'org.greenrobot:greendao:3.3.0' // add library
}

3:添加完依赖后,使用GreenDao

  1. 创建实体类
  2. 生成对应的DaoMaster,DaoSession,Dao。可以在build文件下看到
  3. 通过Dao对象完成增删改查

4:新建model包,定义一个实体类,创建GoodsModel类

    private Long id;private Integer goodsId;private String name;private String icon;private String info;private String type;

通过点击的MakeProject,便发现GreenDao为我们的GoodsModel实体类生成了对应的Getter、Setter方法以及俩个构造函数,同时在我们配置的com.ping.greendao.gen包下生成了三个对应类文件DaoMaster、DaoSession和MeiziDao,之后所有相关的数据库操作都依靠这三个文件了

  1. @Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类;
  2. @NotNull–设置表中当前列的值不可为空
  3. @ConVert–指定自定义类型(@link PropertyConverter)
  4. @Id–主键Long型,可以通过@Id(autoincrement=ture)实现增长
  5. @Index–创建一个索引
  6. @JoinEntity–定义表连接关系
  7. @Unique–先数据库添加一个唯一约束
  8. @OrferBy–指定排序

5:通过Application创建全局,数据库对象,包含创建数据库、创建数据库表

  1. DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类
  2. DaoSession管理特定模式的所有可用Dao对象,可以使用其中一个getter方法获取
package com.hanjie.greendao_2021_0423;import android.app.Application;import com.hanjie.greendao_2021_0423.model.DaoMaster;
import com.hanjie.greendao_2021_0423.model.DaoSession;import org.greenrobot.greendao.database.Database;public class MyApplication extends Application {public static DaoSession daoSession;@Overridepublic void onCreate() {super.onCreate();initDb();}public void initDb () {//        获取SQLiteOpenHelper对象devOpenHelperDaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "hanjie.db");
//        获取SQLiteDatabase//SQLiteDatabase db = devOpenHelper.getWritableDatabase();
//        加密数据库Database database = devOpenHelper.getEncryptedWritableDb("12345");
//        创建DaoMaster实例
//        DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类(而不是对象)。
//        它具有静态方法来创建表或将它们删除。
//        其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。DaoMaster daoMaster = new DaoMaster(database);
//        管理特定模式的所有可用Dao对象daoSession = daoMaster.newSession();}}

六:编写DaoManager,用于增删改查的操作以及数据库的升级。新建assets文件夹,添加数据来源

package com.hanjie.greendao_2021_0423.manager;import android.content.Context;import com.hanjie.greendao_2021_0423.MyApplication;import com.hanjie.greendao_2021_0423.model.GoodsModel;
import com.hanjie.greendao_2021_0423.model.GoodsModelDao;
import com.hanjie.greendao_2021_0423.utils.DataUtils;import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;public class GreenDaoManager {private Context mContext;private GoodsModelDao mGoodsModelDao;public GreenDaoManager(Context context){mContext = context;mGoodsModelDao = MyApplication.daoSession.getGoodsModelDao();}//添加数据到数据库public void insertGoods () {String json = DataUtils.getJson("goods.json", mContext);
//        因为重复添加数据而导致崩溃,可以使用insertOrReplaceInTx API
//        mGoodsModelDao.insertInTx(DataUtils.getGoodsModels(json));mGoodsModelDao.insertOrReplaceInTx(DataUtils.getGoodsModels(json));}//查询所有public List<GoodsModel> queryGoods(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder().orderAsc(GoodsModelDao.Properties.GoodsId);return query.list();}//查询水果public List<GoodsModel> queryFruits(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();query = query.where(GoodsModelDao.Properties.Type.eq("0")).orderAsc(GoodsModelDao.Properties.GoodsId);;return query.list();}//查询零食public List<GoodsModel> querySnacks(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();query = query.where(GoodsModelDao.Properties.Type.eq("1")).orderAsc(GoodsModelDao.Properties.GoodsId);;return query.list();}//删除指定数据public void deleteGoodsInfo(GoodsModel goodsModel){mGoodsModelDao.delete(goodsModel);}public void updateGoodsInfo(GoodsModel goodsModel){mGoodsModelDao.update(goodsModel);}}

七:在主方法中调用,插入到数据库,将查询显示到界面上
1.插入和查询

 //按钮的点击事件 public void onAddGoodsClick (View v) {mDBManager.insertGoods();}/*** 查询全部商品* @param v*/public void onQueryAllClick (View v) {List<GoodsModel> dataSource = mDBManager.queryGoods();notifyAdapter(dataSource);}/*** 筛选-水果* @param v*/public void onQueryFruitsClick (View v) {notifyAdapter(mDBManager.queryFruits());}/*** 筛选-零食* @param v*/public void onQuerySnacksClick (View v) {notifyAdapter(mDBManager.querySnacks());}/*** 改变展示数据*/private void notifyAdapter (List<GoodsModel> dataSource) {mAdapter.setDataSource(dataSource);}

2.更新和删除

// 保存编辑点击事件public void onEditClick(View v) {String info = mEtInfo.getText().toString();mGoodsModel.setInfo(info);mDbManager.updateGoodsInfo(mGoodsModel);onBackPressed();}//删除商品public void onDelClick(View v) {String info = mEtInfo.getText().toString();mGoodsModel.setInfo(info);mDbManager.deleteGoodsInfo(mGoodsModel);onBackPressed();}

八:代码

1.MainActivity.java

package com.hanjie.greendao_2021_0423;import android.os.Bundle;import android.view.View;import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.hanjie.greendao_2021_0423.manager.GreenDaoManager;
import com.hanjie.greendao_2021_0423.model.GoodsModel;import java.util.List;public class MainActivity extends AppCompatActivity {private GreenDaoManager mDBManager;private GoodsAdapter mAdapter;private RecyclerView mRv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}@Overrideprotected void onResume() {super.onResume();
//        查询所有的商品notifyAdapter(mDBManager.queryGoods());}private void init () {mDBManager = new GreenDaoManager(this);initView();}private void initView () {mRv = findViewById(R.id.rv);mAdapter = new GoodsAdapter(this);mRv.setLayoutManager(new LinearLayoutManager(this));mRv.setAdapter(mAdapter);}/*** 进货按钮的点击事件* @param v*/public void onAddGoodsClick (View v) {mDBManager.insertGoods();}/*** 查询全部商品* @param v*/public void onQueryAllClick (View v) {List<GoodsModel> dataSource = mDBManager.queryGoods();notifyAdapter(dataSource);}/*** 筛选-水果* @param v*/public void onQueryFruitsClick (View v) {notifyAdapter(mDBManager.queryFruits());}/*** 筛选-零食* @param v*/public void onQuerySnacksClick (View v) {notifyAdapter(mDBManager.querySnacks());}/*** 改变展示数据*/private void notifyAdapter (List<GoodsModel> dataSource) {mAdapter.setDataSource(dataSource);}}

MyApplication.java

package com.hanjie.greendao_2021_0423;import android.app.Application;import com.hanjie.greendao_2021_0423.model.DaoMaster;
import com.hanjie.greendao_2021_0423.model.DaoSession;import org.greenrobot.greendao.database.Database;public class MyApplication extends Application {public static DaoSession daoSession;@Overridepublic void onCreate() {super.onCreate();initDb();}public void initDb () {//        获取SQLiteOpenHelper对象devOpenHelperDaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(this, "hanjiehan.db");
//        获取SQLiteDatabase//SQLiteDatabase db = devOpenHelper.getWritableDatabase();
//        加密数据库Database database = devOpenHelper.getEncryptedWritableDb("12345");
//        创建DaoMaster实例
//        DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的Dao类(而不是对象)。
//        它具有静态方法来创建表或将它们删除。
//        其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。DaoMaster daoMaster = new DaoMaster(database);
//        管理特定模式的所有可用Dao对象daoSession = daoMaster.newSession();}}

4.GoodsDetailActivity.java

package com.hanjie.greendao_2021_0423;import android.os.Bundle;import android.view.View;
import android.widget.EditText;import androidx.appcompat.app.AppCompatActivity;import com.hanjie.greendao_2021_0423.manager.GreenDaoManager;
import com.hanjie.greendao_2021_0423.model.GoodsModel;public class GoodsDetailActivity extends AppCompatActivity {private GreenDaoManager mDbManager;private EditText mEtInfo;private GoodsModel mGoodsModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_goods_detail);mDbManager = new GreenDaoManager(this);mGoodsModel = getIntent().getParcelableExtra("goodsModel");mEtInfo = findViewById(R.id.et_info);mEtInfo.setText(mGoodsModel.getInfo());}/*** 保存编辑点击事件* @param v*/public void onEditClick(View v) {String info = mEtInfo.getText().toString();mGoodsModel.setInfo(info);mDbManager.updateGoodsInfo(mGoodsModel);onBackPressed();}/*** 删除商品* @param v*/public void onDelClick(View v) {String info = mEtInfo.getText().toString();mGoodsModel.setInfo(info);mDbManager.deleteGoodsInfo(mGoodsModel);onBackPressed();}
}
  1. GoodsAdapter
package com.hanjie.greendao_2021_0423;import android.content.Context;
import android.content.Intent;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.hanjie.greendao_2021_0423.model.GoodsModel;import java.util.List;public class GoodsAdapter extends RecyclerView.Adapter<GoodsAdapter.VH> {private List<GoodsModel> dataSource;public void setDataSource(List<GoodsModel> dataSource) {this.dataSource = dataSource;notifyDataSetChanged();}private Context mContext;public GoodsAdapter(Context context) {this.mContext = context;}@NonNull@Overridepublic VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {VH vh = new VH(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.goods_item,viewGroup, false));return vh;}@Overridepublic void onBindViewHolder(@NonNull VH vh, int i) {final GoodsModel model = dataSource.get(i);vh.mIvIcon.setImageResource(mContext.getResources().getIdentifier(model.getIcon(), "mipmap", mContext.getPackageName()));vh.mTvName.setText(model.getName());vh.mTvInfo.setText(model.getInfo());vh.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext, GoodsDetailActivity.class);intent.putExtra("goodsModel", model);mContext.startActivity(intent);}});}@Overridepublic int getItemCount() {if (dataSource == null) return 0;return dataSource.size();}public static class VH extends RecyclerView.ViewHolder {public ImageView mIvIcon;public TextView mTvName,mTvInfo;public VH(@NonNull View itemView) {super(itemView);mIvIcon = itemView.findViewById(R.id.iv_icon);mTvName = itemView.findViewById(R.id.tv_name);mTvInfo = itemView.findViewById(R.id.tv_info);}}}

6.DataUtils

package com.hanjie.greendao_2021_0423.utils;import android.content.Context;
import android.content.res.AssetManager;import com.hanjie.greendao_2021_0423.model.GoodsModel;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;public class DataUtils {/*** 获取数据* @param fileName* @param context* @return*/public static String getJson(String fileName, Context context) {//将json数据变成字符串StringBuilder stringBuilder = new StringBuilder();try {//获取assets资源管理器AssetManager assetManager = context.getAssets();//通过管理器打开文件并读取BufferedReader bf = new BufferedReader(new InputStreamReader(assetManager.open(fileName)));String line;while ((line = bf.readLine()) != null) {stringBuilder.append(line);}} catch (IOException e) {e.printStackTrace();}return stringBuilder.toString();}public static List<GoodsModel> getGoodsModels (String json){List<GoodsModel> result = new ArrayList<>();try {JSONArray jsonArray = new JSONArray(json);for (int i = 0 ; i < jsonArray.length() ; i ++) {JSONObject object = jsonArray.getJSONObject(i);GoodsModel goodsModel = new GoodsModel();goodsModel.setGoodsId(object.getInt("goodsId"));goodsModel.setIcon(object.getString("icon"));goodsModel.setInfo(object.getString("info"));goodsModel.setName(object.getString("name"));goodsModel.setType(object.getString("type"));result.add(goodsModel);}} catch (JSONException e) {e.printStackTrace();}return result;}
}
  1. GoodsModel.java
package com.hanjie.greendao_2021_0423.model;import android.os.Parcel;
import android.os.Parcelable;import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;
import org.greenrobot.greendao.annotation.Index;
import org.greenrobot.greendao.annotation.Unique;@Entity
public class GoodsModel implements Parcelable {@Id(autoincrement = true)private Long id;@Index(unique = true)private Integer goodsId;private String name;private String icon;private String info;private String type;protected GoodsModel(Parcel in) {if (in.readByte() == 0) {id = null;} else {id = in.readLong();}if (in.readByte() == 0) {goodsId = null;} else {goodsId = in.readInt();}name = in.readString();icon = in.readString();info = in.readString();type = in.readString();}@Generated(hash = 1834473137)public GoodsModel(Long id, Integer goodsId, String name, String icon,String info, String type) {this.id = id;this.goodsId = goodsId;this.name = name;this.icon = icon;this.info = info;this.type = type;}@Generated(hash = 971639536)public GoodsModel() {}public static final Creator<GoodsModel> CREATOR = new Creator<GoodsModel>() {@Overridepublic GoodsModel createFromParcel(Parcel in) {return new GoodsModel(in);}@Overridepublic GoodsModel[] newArray(int size) {return new GoodsModel[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {if (id == null) {dest.writeByte((byte) 0);} else {dest.writeByte((byte) 1);dest.writeLong(id);}if (goodsId == null) {dest.writeByte((byte) 0);} else {dest.writeByte((byte) 1);dest.writeInt(goodsId);}dest.writeString(name);dest.writeString(icon);dest.writeString(info);dest.writeString(type);}public Long getId() {return this.id;}public void setId(Long id) {this.id = id;}public Integer getGoodsId() {return this.goodsId;}public void setGoodsId(Integer goodsId) {this.goodsId = goodsId;}public String getName() {return this.name;}public void setName(String name) {this.name = name;}public String getIcon() {return this.icon;}public void setIcon(String icon) {this.icon = icon;}public String getInfo() {return this.info;}public void setInfo(String info) {this.info = info;}public String getType() {return this.type;}public void setType(String type) {this.type = type;}
}

8.GreenDaoManager.java

package com.hanjie.greendao_2021_0423.manager;import android.content.Context;import com.hanjie.greendao_2021_0423.MyApplication;import com.hanjie.greendao_2021_0423.model.GoodsModel;
import com.hanjie.greendao_2021_0423.model.GoodsModelDao;
import com.hanjie.greendao_2021_0423.utils.DataUtils;import org.greenrobot.greendao.query.Query;
import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;public class GreenDaoManager {private Context mContext;private GoodsModelDao mGoodsModelDao;public GreenDaoManager(Context context){mContext = context;mGoodsModelDao = MyApplication.daoSession.getGoodsModelDao();}//添加数据到数据库public void insertGoods () {String json = DataUtils.getJson("goods.json", mContext);
//        如果不想因为重复添加数据而导致崩溃,可以使用insertOrReplaceInTx API
//        mGoodsModelDao.insertInTx(DataUtils.getGoodsModels(json));mGoodsModelDao.insertOrReplaceInTx(DataUtils.getGoodsModels(json));}//查询所有public List<GoodsModel> queryGoods(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder().orderAsc(GoodsModelDao.Properties.GoodsId);return query.list();}//查询水果public List<GoodsModel> queryFruits(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();query = query.where(GoodsModelDao.Properties.Type.eq("0")).orderAsc(GoodsModelDao.Properties.GoodsId);;return query.list();}//查询零食public List<GoodsModel> querySnacks(){QueryBuilder<GoodsModel> query = mGoodsModelDao.queryBuilder();query = query.where(GoodsModelDao.Properties.Type.eq("1")).orderAsc(GoodsModelDao.Properties.GoodsId);;return query.list();}//删除指定数据public void deleteGoodsInfo(GoodsModel goodsModel){mGoodsModelDao.delete(goodsModel);}public void updateGoodsInfo(GoodsModel goodsModel){mGoodsModelDao.update(goodsModel);}}

9.goods.json:资源文件

[{"goodsId": 2,"type": "0","icon": "huolongguo","name": "火龙果","info": "火龙果(学名:Hylocereus undatus 'Foo-Lon')是仙人掌科、量天尺属量天尺的栽培品种,攀援肉质灌木,具气根。"},{"goodsId": 1,"type": "0","icon": "chengzi","name": "橙子","info": "橙子(学名:Citrus sinensis 英语:orange),是芸香科柑橘属植物橙树的果实,亦称为黄果、柑子、金环、柳丁。橙子是一种柑果,有很高的食用,药用价值。"},{"goodsId": 7,"type": "0","icon": "yingtao","name": "樱桃","info": "樱桃(学名:Cerasus pseudocerasus),是某些李属类植物的统称,包括樱桃亚属、酸樱桃亚属、桂樱亚属等。"},{"goodsId": 0,"type": "0","icon": "caomei","name": "草莓","info": "草莓(学名:Fragaria × ananassa Duch.),多年生草本植物。高10-40厘米,茎低于叶或近相等,密被开展黄色柔毛。"},{"goodsId": 5,"type": "0","icon": "xiangjiao","name": "香蕉","info": "香蕉(学名:Musa nana Lour.)芭蕉科芭蕉属植物,又指其果实,热带地区广泛种植。"},{"goodsId": 3,"type": "0","icon": "pingguo","name": "苹果","info": "苹果(学名:Malus pumila)是水果的一种,是蔷薇科苹果亚科苹果属植物,其树为落叶乔木。"},{"goodsId": 4,"type": "0","icon": "shiliu","name": "石榴","info": "石榴(拉丁名:Punica granatum L.)落叶乔木或灌木;单叶,通常对生或簇生,无托叶。"},{"goodsId": 12,"type": "1","icon": "qiaokeli","name": "巧克力","info": "巧克力(chocolate),原产中南美洲,其鼻祖是“xocolatl”,意为“苦水”。其主要原料可可豆产于赤道南北纬18度以内的狭长地带。"},{"goodsId": 6,"type": "0","icon": "xigua","name": "西瓜","info": "西瓜(学名:Citrullus lanatus (Thunb.) Matsum. et Nakai)一年生蔓生藤本;茎、枝粗壮,具明显的棱。"},{"goodsId": 13,"type": "1","icon": "tiantianquan","name": "甜甜圈","info": "甜甜圈,又称多拿滋、唐纳滋,它是一种用面粉、白砂糖、奶油和鸡蛋混合之后再经过油炸的甜食。"},{"goodsId": 8,"type": "1","icon": "baomihua","name": "爆米花","info": "爆米花(Popcorn)是用玉米、酥油、糖一起放进爆米花的机器里做成的一种膨化食品,味道比较甜。"},{"goodsId": 10,"type": "1","icon": "jianguo","name": "坚果","info": "坚果,是闭果的一个分类,果皮坚硬,内含1粒或者多粒种子。"},{"goodsId": 9,"type": "1","icon": "binggan","name": "饼干","info": "饼干 [1]  的词源是“烤过两次的面包”,是从法语的bis(再来一次)和cuit(烤)中由来的。"},{"goodsId": 11,"type": "1","icon": "mianhuatang","name": "棉花糖","info": "这是一种柔软粘糯,有胶体性和微和弹性,含水分10%~20%,含还原糖20%~30%的软性糖果。"}
]

10.布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="@dimen/padding_size"android:orientation="horizontal"android:weightSum="4"><TextViewandroid:text="进货"android:layout_marginRight="@dimen/margin_size"style="@style/top_item"android:onClick="onAddGoodsClick"/><TextViewandroid:text="全部"android:layout_marginRight="@dimen/margin_size"style="@style/top_item"android:onClick="onQueryAllClick"/><TextViewandroid:text="水果"android:layout_marginRight="@dimen/margin_size"style="@style/top_item"android:onClick="onQueryFruitsClick"/><TextViewandroid:text="零食"style="@style/top_item"android:onClick="onQuerySnacksClick"/></LinearLayout><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rv"android:layout_width="match_parent"android:layout_height="match_parent"></androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

layout\activity_goods_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".GoodsDetailActivity"><EditTextandroid:id="@+id/et_info"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@null"android:padding="@dimen/padding_size"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="确认修改"android:layout_margin="@dimen/margin_size"android:textColor="@android:color/white"android:background="@color/colorPrimary"android:onClick="onEditClick"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="删除商品"android:layout_margin="@dimen/margin_size"android:textColor="@android:color/white"android:background="@android:color/holo_red_dark"android:onClick="onDelClick"/></LinearLayout>

layout\goods_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="@dimen/padding_size"android:background="@android:color/white"><ImageViewandroid:id="@+id/iv_icon"android:layout_width="80dp"android:layout_height="80dp"android:src="@mipmap/ic_launcher"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="@dimen/margin_size"android:orientation="vertical"android:padding="@dimen/padding_size"><TextViewandroid:id="@+id/tv_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16sp"android:textColor="#333333"android:text="产品名称"/><TextViewandroid:id="@+id/tv_info"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="3dp"android:textSize="12sp"android:textColor="#666666"android:text="产品简介"android:maxLines="2"android:ellipsize="end"/></LinearLayout></LinearLayout>

GreenDao使用相关推荐

  1. greendao3出现 Error:Execution failed for task ':app:greendao'

    错误如上图,最近下载一个Greendao的demo运行出现上述错误, 这个是build配置错误 修改build 就可以了 1       Moudle的gradle中 apply plugin: 'o ...

  2. GreenDao 3.x 注解中ToOne和ToMany的个人理解

    GreenDao是什么东西这个就不用多说了.自从GreenDao升级到3.0之后,编译的方法发生了改变.当然这个改变是有助于快速开发的. 区别在哪随便百度一下都可以知道.这里就不多说了. 这里主要说的 ...

  3. GreenDao使用注意事项

    如果新版本中新增加了表,需要修改greendao配置中schemaVersion,让其加1即可 greendao {schemaVersion, 2daoPackage 'com.xx.xx.stor ...

  4. GreenDao自带异步操作类简析

    AsyncSession: GreenDao提供一个异步操作的统一接口类AsyncSession,它提供了你所需要的所有异步操作方法. 你可以通过调用DaoSession#startAsyncSess ...

  5. GreenDao存储自定义类型对象解决方案(转)

    最近公司项目选用GreenDao作为Android客户端本地数据库的对象关系映射框架.对于GreenDao虽然以往也有简单用过,但这还是笔者第一次在实际业务中使用.碰到了题目所述的两个问题,虽然在Tu ...

  6. greenDAO缓存遇到的大坑的解决方法

    greenDAO缓存遇到的大坑的解决方法 参考文章: (1)greenDAO缓存遇到的大坑的解决方法 (2)https://www.cnblogs.com/yongfengnice/p/1146635 ...

  7. android 连接mysql orm_Android ORM框架 GreenDao 的使用详解

    一.前言 关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储和文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 S ...

  8. 安卓GreenDao框架一些进阶用法整理(转)

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

  9. greendao引起的NoClassDefFoundError异常解决

    在使用Android studio导入eclipse工程师报错,因为原工程引用了greendao的第三方工程包 java.lang.NoClassDefFoundError: org.greenrob ...

  10. GreenDao高级用法

    GreenDao高级用法: 1.类内部有List 2.类内部有类 3.类内部有List<类> 1.类内部有List 复制该类到项目内 import org.greenrobot.green ...

最新文章

  1. 股市币市:数据分析与交易所公告(20190227)
  2. 关于Scala递归返回参数的问题
  3. Zend Studio实现移动程序开发一体化的秘密武器——CCM
  4. selenium search
  5. 征稿 | ​第 9 届国际语义技术联合会议征稿(截稿日 9 月 8 号)
  6. oracle查询语句大全(oracle 基本命令大全一)
  7. 高时空损耗的Scanner会卡爆程序(记洛谷P1567的Java性能优化,Java语言描述)
  8. C++ : 自写两个字符串分割函数(含测试程序)
  9. 从零开始学编程系列汇总
  10. Word文档怎么取消密码
  11. 盘点关于程序员的那些经典案例
  12. u盘克隆服务器系统,只需4步!简单又快速的克隆U盘
  13. Apache本地localhost访问正常通过IP访问提示You dont have permission to access
  14. 小程序 初始化 登录 流程
  15. TTE时间触发以太网
  16. 【读书笔记】《数学之美》——一个好方法在形式上总是简单的
  17. 以大数据重塑K12在线教育
  18. 【互联网品读】京东,真的服了,东哥走火入魔了?全员绩效合同
  19. 笔记本外接显示器显示器水波纹问题+解决方案
  20. 联表查询和嵌套查询—读懂数据库仓储

热门文章

  1. LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol(转)
  2. Android 闹钟选择铃声,怎么设置闹钟铃声为自己喜欢的音乐
  3. 要在增程之外再造高端纯电爆品,理想MEGA是不是太狂了?
  4. Vue项目快速输出到小程序、H5
  5. 管理者,你需要人才还是奴才?
  6. Android-UI-解决动画残影问题
  7. python---26----简单的加减法数学游戏
  8. php 导出 Excel
  9. matlab绘三维椭球面_运用Matlab讨论椭球面性质
  10. 换ssd后Oracle,更换SSD固态硬盘后电脑无法开机原因分析和解决办法