GreenDao的簡單使用說明(二)單表的增,刪,改,查
來自: http://blog.csdn.net//chenguang79/article/details/50441343
通過上一篇文章,我們已經把GreenDao框架架起來了,而且三個基礎操作類和Users的用戶類也建立起來了,哪么下面我們就來實現一下,對于這個單表的增,刪,改,查功能.
這里說明一下,因為是做一個簡單的例子,所以這里我對數據庫的操作,沒有做異步處理.
第一步,我們要先來寫一個類BaseApplication.java,此類是用來取得GreenDao中的DaoMaster和DaoSession的,先看代碼.
package com.example.cg.greendaolearn.db; import android.app.Application; import android.content.Context; import com.example.cg.greendaolearn.THDevOpenHelper; import com.guangda.dao.DaoMaster; import com.guangda.dao.DaoSession; /** * 官方推薦將取得DaoMaster對象的方法放到Application層這樣避免多次創建生成Session對象。 * Created by cg on 2015/12/29. */ public class BaseApplication extends Application { private static BaseApplication mInstance; private static DaoMaster daoMaster; private static DaoSession daoSession; @Override public void onCreate() { super.onCreate(); if(mInstance == null) mInstance = this; } /** * 取得DaoMaster * * @param context 上下文 * @return DaoMaster */ public static DaoMaster getDaoMaster(Context context) { if (daoMaster == null) { DaoMaster.OpenHelper helper = new THDevOpenHelper(context,"myDb",null); daoMaster = new DaoMaster(helper.getWritableDatabase()); } return daoMaster; } /** * 取得DaoSession * * @param context 上下文 * @return DaoSession */ public static DaoSession getDaoSession(Context context) { if (daoSession == null) { if (daoMaster == null) { daoMaster = getDaoMaster(context); } daoSession = daoMaster.newSession(); } return daoSession; } }通過代碼上的注釋,我們也知道了,只所以要繼承自application,主要就是為了避免多次創建生成Session對象,提高性能.
第二步,建立一個操作類,把增,刪,改,查的方法,全寫進去.方便調用.代碼如下
DbService.java
package com.example.cg.greendaolearn.db; import android.content.Context; import android.text.TextUtils; import android.util.Log; import com.guangda.dao.DaoSession; import com.guangda.dao.UsersDao; import java.util.List; import greendao.Users; /** * 用戶操作類 * Created by cg on 2015/12/29. */ public class DbService { private static final String TAG = DbService.class.getSimpleName(); private static DbService instance; private static Context appContext; private DaoSession mDaoSession; private UsersDao userDao; private DbService() { } /** * 采用單例模式 * @param context 上下文 * @return dbservice */ public static DbService getInstance(Context context) { if (instance == null) { instance = new DbService(); if (appContext == null){ appContext = context.getApplicationContext(); } instance.mDaoSession = BaseApplication.getDaoSession(context); instance.userDao = instance.mDaoSession.getUsersDao(); } return instance; } /** * 根據用戶id,取出用戶信息 * @param id 用戶id * @return 用戶信息 */ public Users loadNote(long id) { if(!TextUtils.isEmpty(id + "")) { return userDao.load(id); } return null; } /** * 取出所有數據 * @return 所有數據信息 */ public List<Users> loadAllNote(){ return userDao.loadAll(); } /** * 生成按id倒排序的列表 * @return 倒排數據 */ public List<Users> loadAllNoteByOrder() { return userDao.queryBuilder().orderDesc(UsersDao.Properties.Id).list(); } /** * 根據查詢條件,返回數據列表 * @param where 條件 * @param params 參數 * @return 數據列表 */ public List<Users> queryNote(String where, String... params){ return userDao.queryRaw(where, params); } /** * 根據用戶信息,插件或修改信息 * @param user 用戶信息 * @return 插件或修改的用戶id */ public long saveNote(Users user){ return userDao.insertOrReplace(user); } /** * 批量插入或修改用戶信息 * @param list 用戶信息列表 */ public void saveNoteLists(final List<Users> list){ if(list == null || list.isEmpty()){ return; } userDao.getSession().runInTx(new Runnable() { @Override public void run() { for(int i=0; i<list.size(); i++){ Users user = list.get(i); userDao.insertOrReplace(user); } } }); } /** * 刪除所有數據 */ public void deleteAllNote(){ userDao.deleteAll(); } /** * 根據id,刪除數據 * @param id 用戶id */ public void deleteNote(long id){ userDao.deleteByKey(id); Log.i(TAG, "delete"); } /** * 根據用戶類,刪除信息 * @param user 用戶信息類 */ public void deleteNote(Users user){ userDao.delete(user); } }這個類就不多說了,大家一看就明白,很簡單,而且里面也已經比較明確的給出了注解.
第三步,設置布局文件
1,Toolbar的代碼:
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:theme="@style/ThemeOverlay.AppCompat.ActionBar"> </android.support.v7.widget.Toolbar>
當然了,你要是想使用toolbar,還要為其設置樣式,style.xml
<resources> <style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- toolbar(actionbar)顏色 --> <item name="colorPrimary">#4876FF</item> <!-- 狀態欄顏色 --> <item name="colorPrimaryDark">#3A5FCD</item> <!--toolbar文字的顏色--> <item name="@android:textColorPrimary">@android:color/white</item> <!-- 窗口的背景顏色 --> <item name="android:windowBackground">@android:color/white</item> <!-- SearchView --> <item name="searchViewStyle">@style/MySearchViewStyle</item> <item name="actionMenuTextColor">#ffffff</item> </style> <style name="AppTheme" parent="@style/AppBaseTheme"> <item name="android:windowIsTranslucent">true</item> </style> <style name="MySearchViewStyle" parent="Widget.AppCompat.SearchView"></style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style> </resources>
現在來看一下頁面主布局,這個布局其實很簡單,就是一個Toolbar,Toolbar上菜單有一個添加的按鈕,而且下面是一個listView用來顯示用戶,點擊添加按鈕,彈出一個對話框,顯示你要添加的項,填寫完后,保存,新加的數據就會在listView中顯示出來.點擊列表項,會彈出對框,上面有刪除與修改的選項,可以對此項進行刪除與修改,
好,先來看一下activity_one_table.xml文件
<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" tools:context="com.example.cg.greendaolearn.oneTableActivity" android:orientation="vertical"> <include layout="@layout/toolbar" /> <ListView android:id="@+id/lv_oneTable" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
接下來,看一下,toolbar菜單欄的布局文件,menu_one_table.xml.主要就是添加了一個添加的按鈕
<menu 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" tools:context="com.example.cg.greendaolearn.oneTableActivity"> <item android:id="@+id/menu_onetable_add" android:title="添加" app:showAsAction="never" /> </menu>
下面是listView列表顯示,哪么我們先為這個列表設置一個item的布局.代碼比較簡單:'
activity_onetable_lv_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/coral"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="姓名:" android:textColor="@color/white" android:padding="5dp"/> <TextView android:id="@+id/txt_onetable_uName" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/white" android:padding="5dp"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="性別:" android:textColor="@color/white" android:padding="5dp"/> <TextView android:id="@+id/txt_onetable_uSex" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/white" android:padding="5dp"/> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="年紀:" android:textColor="@color/white" android:padding="5dp"/> <TextView android:id="@+id/txt_onetable_age" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/white" android:padding="5dp"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="電話:" android:textColor="@color/white" android:padding="5dp"/> <TextView android:id="@+id/txt_onetable_tel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/white" android:padding="5dp"/> </LinearLayout> </LinearLayout> </LinearLayout>
為再為它設計一個Adapter
onetable_adapter.java
package com.example.cg.greendaolearn.adpater; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import com.example.cg.greendaolearn.R; import java.util.List; import greendao.Users; /** * 用戶信息顯示Adapter * Created by cg on 2015/12/29. */ public class onetable_adapter extends BaseAdapter { private LayoutInflater inflater; private List<Users> list_user; public onetable_adapter(Context context,List<Users> list_user) { this.inflater = LayoutInflater.from(context); this.list_user = list_user; } @Override public int getCount() { return list_user.size(); } @Override public Object getItem(int position) { return list_user.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { userInfo uInfo; if(convertView==null) { uInfo = new userInfo(); convertView = inflater.inflate(R.layout.activity_onetable_lv_item,null); uInfo.uAge = (TextView)convertView.findViewById(R.id.txt_onetable_age); uInfo.uName = (TextView)convertView.findViewById(R.id.txt_onetable_uName); uInfo.uSex = (TextView)convertView.findViewById(R.id.txt_onetable_uSex); uInfo.uTel = (TextView)convertView.findViewById(R.id.txt_onetable_tel); convertView.setTag(uInfo); }else { uInfo = (userInfo)convertView.getTag(); } uInfo.uSex.setText(list_user.get(position).getUSex()); uInfo.uTel.setText(list_user.get(position).getUTelphone()); uInfo.uName.setText(list_user.get(position).getUName()); uInfo.uAge.setText(list_user.get(position).getUAge()); return convertView; } public class userInfo { TextView uName; TextView uSex; TextView uAge; TextView uTel; } }
listVIew搞定了.我們來完成點擊添加時,彈出的對話框,這里采用的DialogFragment
先看布局文件fragment_onetable_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="姓名:"/> <EditText android:id="@+id/edit_onetable_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/black"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="性別:"/> <EditText android:id="@+id/edit_onetable_sex" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/black"/> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="電話:"/> <EditText android:id="@+id/edit_onetable_tel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/black"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:text="年紀:"/> <EditText android:id="@+id/edit_onetable_age" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textColor="@color/black"/> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout>
代碼:oneTableDialogFragment.java
package com.example.cg.greendaolearn; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; /** * 用戶添加與修改 * Created by cg on 2015/12/30. */ public class oneTableDialogFragment extends DialogFragment { private EditText edit_onetable_name; private EditText edit_onetable_sex; private EditText edit_onetable_tel; private EditText edit_onetable_age; private String uName; //用戶姓名 private String uSex; //用戶性別 private String uAge; //用戶年紀 private String uTel; //用戶電話 private int flag; //flag 標識 0:添加 1:修改 private long uId; //用戶id,添加時為0,修改時為正確的id /** * 定義點擊事件接口 */ public interface addUserOnClickListener { void onAddUserOnClick(long id,String uName, String uSex,String uAge,String uTel,int flag); } public oneTableDialogFragment(long uId,String uName, String uSex, String uAge, String uTel,int flag) { this.uName = uName; this.uSex = uSex; this.uAge = uAge; this.uTel = uTel; this.flag = flag; this.uId = uId; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_onetable_dialog, null); edit_onetable_name = (EditText) view.findViewById(R.id.edit_onetable_name); edit_onetable_sex = (EditText) view.findViewById(R.id.edit_onetable_sex); edit_onetable_tel = (EditText) view.findViewById(R.id.edit_onetable_tel); edit_onetable_age = (EditText)view.findViewById(R.id.edit_onetable_age); edit_onetable_name.setText(uName); edit_onetable_age.setText(uAge); edit_onetable_sex.setText(uSex); edit_onetable_tel.setText(uTel); // Inflate and set the layout for the dialog // Pass null as the parent view because its going in the dialog layout builder.setView(view) // Add action buttons .setTitle("添加用戶") .setPositiveButton("添加", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { addUserOnClickListener listener = (addUserOnClickListener) getActivity(); listener.onAddUserOnClick(uId,edit_onetable_name.getText().toString(), edit_onetable_sex.getText().toString(), edit_onetable_age.getText().toString(), edit_onetable_tel.getText().toString(), flag); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { edit_onetable_name.setText(""); edit_onetable_sex.setText(""); edit_onetable_age.setText(""); edit_onetable_tel.setText(""); } }); return builder.create(); } }
這里就不多說了,一是代碼比較簡單,二是里面的注釋也比較清楚,大家一眼就明白了.
下面就是對點擊item項的時候,彈出的對框進行設計,先看布局,就兩個textView
fragment_onetable_itemdialog.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/txt_onetable_update" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="修改" android:padding="10dp" android:gravity="center"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray"/> <TextView android:id="@+id/txt_onetable_delete" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="刪除" android:padding="10dp" android:gravity="center"/> </LinearLayout>
代碼:oneTableItemDialogFragment.java
package com.example.cg.greendaolearn; import android.app.DialogFragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.TextView; /** * Created by cg on 2015/12/30. */ public class oneTableItemDialogFragment extends DialogFragment { private long id; //用戶id private int postion; //list中的編號 private TextView txt_onetable_update; private TextView txt_onetable_delete; public interface EditUserOnClickListener { //flag標識,0表示刪除,1表示修改 void onEditUserOnClick(long id,int postion,int flag); } public oneTableItemDialogFragment(long id,int postion) { this.id = id; this.postion = postion; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); View view = inflater.inflate(R.layout.fragment_onetable_itemdialog,container); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); txt_onetable_update = (TextView)view.findViewById(R.id.txt_onetable_update); txt_onetable_update.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditUserOnClickListener listener = (EditUserOnClickListener) getActivity(); listener.onEditUserOnClick(id,postion,1); } }); txt_onetable_delete = (TextView)view.findViewById(R.id.txt_onetable_delete); txt_onetable_delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditUserOnClickListener listener = (EditUserOnClickListener) getActivity(); listener.onEditUserOnClick(id,postion,0); } }); } }
OK了,現在我們來看一下,主程序的代碼:oneTableActivity.java
package com.example.cg.greendaolearn; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.Toast; import com.example.cg.greendaolearn.adpater.onetable_adapter; import com.example.cg.greendaolearn.db.DbService; import java.util.ArrayList; import java.util.List; import greendao.Users; public class oneTableActivity extends AppCompatActivity implements oneTableDialogFragment.addUserOnClickListener,oneTableItemDialogFragment.EditUserOnClickListener { private Toolbar toolbar; //定義toolbar private ListView lv_oneTable; private List<Users> list_user; private onetable_adapter oAdapter; private DbService db; private oneTableItemDialogFragment oneItemDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_one_table); toolbar = (Toolbar)this.findViewById(R.id.toolbar); toolbar.setTitle("單表操作"); // 標題的文字需在setSupportActionBar之前,不然會無效 setSupportActionBar(toolbar); db = DbService.getInstance(this); initControls(); initData(); } /** * 初始化數據,剛進入頁面時加載 */ private void initData() { list_user = new ArrayList<>(); list_user = db.loadAllNoteByOrder(); oAdapter = new onetable_adapter(this,list_user); lv_oneTable.setAdapter(oAdapter); } /** * 初始化控件 */ private void initControls() { lv_oneTable = (ListView)findViewById(R.id.lv_oneTable); lv_oneTable.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(oneTableActivity.this,list_user.get(position).getUName() + "--" + list_user.get(position).getId(),Toast.LENGTH_SHORT).show(); oneItemDialog = new oneTableItemDialogFragment(list_user.get(position).getId(),position); oneItemDialog.show(getFragmentManager(),"編輯"); } }); } @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_one_table, 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.menu_onetable_add) { oneTableDialogFragment oneDialog = new oneTableDialogFragment(0,"","","","",0); oneDialog.show(getFragmentManager(),"添加用戶"); return true; } return super.onOptionsItemSelected(item); } @Override public void onAddUserOnClick(long uId,String uName, String uSex, String uAge, String uTel,int flag) { Users user = new Users(); if(flag==1) { user.setId(uId); } user.setUSex(uSex); user.setUTelphone(uTel); user.setUAge(uAge); user.setUName(uName); if(flag==0) { if (db.saveNote(user) > 0) { list_user.add(0, user); oAdapter.notifyDataSetChanged(); } }else { if (db.saveNote(user) > 0) { int num = 0; for(Users u:list_user) { if(u.getId()==uId) { list_user.remove(num); list_user.add(num,user); break; } num++; } oAdapter.notifyDataSetChanged(); } } } @Override public void onEditUserOnClick(long id,int postion,int flag) { if(flag==0) { db.deleteNote(id); list_user.remove(postion); oAdapter.notifyDataSetChanged(); oneItemDialog.dismiss(); }else { Users updateUser = db.loadNote(id); oneTableDialogFragment oDialog = new oneTableDialogFragment(updateUser.getId(),updateUser.getUName(),updateUser.getUSex(), updateUser.getUAge(), updateUser.getUTelphone(),1); oneItemDialog.dismiss(); oDialog.show(getFragmentManager(),"修改"); } } }
運行效果圖:
本文由用戶 leewinq 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!