简介
上一篇中,我使用已生成的 Dao 完成了数据的添加和删除。
这篇中,将自己生成 Dao,并且用 Dao 实现增删改查的功能。
准备
https://github.com/greenrobot/greenDAO
到这下载 DaoGenerator 子项目,并运行。
说明
GreenDao 没有采取注解的方式来完成 Object Relational Mapping , 因为反射是比较慢的。
GreenDao 有一套生成 Dao 层相关类的框架,也就是 DaoGenerator,通过它就能获得需要的 Dao 了。
DaoGenerator 依赖于 FreeMarker。
MyDaoGenerator.java
public class MyDaoGenerator {
public static void main(String[] args) throws Exception{
Schema schema = new Schema(1, "com.example.GreenDao2");
addPersonEntity(schema);
new DaoGenerator().generateAll(schema, "D:\\");
}
private static Entity addPersonEntity(Schema schema) {
Entity person = schema.addEntity("Person");
person.addIdProperty();
person.addStringProperty("name").notNull();
person.addIntProperty("age");
return person;
}
}
一个简单的实体类 Person,所有相关的类会生成在 D 盘根目录,移到新的项目中就行了。
图片
ListViewAdapter.java
public class ListViewAdapter extends BaseAdapter {
private List<Person> data = new ArrayList<Person>();
private LayoutInflater layoutInflater;
public ListViewAdapter(Activity activity) {
layoutInflater = activity.getLayoutInflater();
}
@Override
public int getCount() {
return data.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Person person = data.get(position);
String text = person.getName() + " " + person.getAge();
TextView textView = (TextView) layoutInflater.inflate(R.layout.listview_item, parent, false);
textView.setText(text);
return textView;
}
public List<Person> getData() {
return data;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
my_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<EditText android:id="@+id/etName"
android:layout_weight="1" android:layout_width="0dp"
android:layout_height="match_parent"
android:hint="name"/>
<EditText android:id="@+id/etAge"
android:layout_weight="1" android:layout_width="0dp"
android:layout_height="match_parent"
android:hint="age"/>
<Button android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="添加"/>
</LinearLayout>
<LinearLayout android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<EditText android:id="@+id/etNameForQuery"
android:layout_weight="1" android:layout_width="0dp"
android:layout_height="match_parent"
android:hint="name to query"/>
<Button android:id="@+id/btnQuery"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="查询"/>
</LinearLayout>
<LinearLayout android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<EditText android:id="@+id/etNameForUpdate"
android:layout_weight="1" android:layout_width="0dp"
android:layout_height="match_parent"
android:hint="name to update"/>
<Button android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="修改"/>
</LinearLayout>
<ListView android:id="@+id/lvNote"
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_weight="1"/>
</LinearLayout>
MyActivity.java
public class MyActivity extends Activity implements View.OnClickListener, AdapterView.OnItemClickListener {
private SQLiteDatabase db;
private PersonDao personDao;
private ListViewAdapter listViewAdapter;
private EditText etName;
private EditText etAge;
private EditText etNameToUpdate;
private EditText etNameToQuery;
private Person personToUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
initDao();
initView();
refreshListView();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnAdd:
onBtnAddClick();
break;
case R.id.btnQuery:
onBtnQueryClick();
break;
case R.id.btnUpdate:
onBtnUpdateClick();
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
personToUpdate = listViewAdapter.getData().get(position);
etNameToUpdate.setText(personToUpdate.getName());
}
private void refreshListView() {
List<Person> dataFromDb = getDataFromDb();
List<Person> listViewData = listViewAdapter.getData();
listViewData.clear();
listViewData.addAll(dataFromDb);
listViewAdapter.notifyDataSetChanged();
}
private List<Person> getDataFromDb() {
String nameToQuery = etNameToQuery.getText().toString();
String sql = "select * from " + PersonDao.TABLENAME + " where " + PersonDao.Properties.Name.columnName + " like ?";
String[] selectionArgs = new String[]{"%" + nameToQuery + "%"};
Cursor cursor = db.rawQuery(sql, selectionArgs);
List<Person> noteList = new ArrayList<Person>();
while (cursor.moveToNext()) {
Long id = cursor.getLong(cursor.getColumnIndex(PersonDao.Properties.Id.columnName));
String name = cursor.getString(cursor.getColumnIndex(PersonDao.Properties.Name.columnName));
Integer age = cursor.getInt(cursor.getColumnIndex(PersonDao.Properties.Age.columnName));
Person note = new Person(id, name, age);
noteList.add(note);
}
return noteList;
}
private void initDao() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "person-db", null);
db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
personDao = daoSession.getPersonDao();
}
private void initView() {
etName = (EditText) findViewById(R.id.etName);
etAge = (EditText) findViewById(R.id.etAge);
etNameToUpdate = (EditText) findViewById(R.id.etNameForUpdate);
etNameToQuery = (EditText) findViewById(R.id.etNameForQuery);
findViewById(R.id.btnAdd).setOnClickListener(this);
findViewById(R.id.btnQuery).setOnClickListener(this);
findViewById(R.id.btnUpdate).setOnClickListener(this);
ListView listView = (ListView) findViewById(R.id.lvNote);
listViewAdapter = new ListViewAdapter(this);
listView.setAdapter(listViewAdapter);
listView.setOnItemClickListener(this);
}
private void onBtnAddClick() {
String name = etName.getText().toString();
String age = etAge.getText().toString();
Person person = new Person(null, name, Integer.valueOf(age));
personDao.insert(person);
refreshListView();
}
private void onBtnQueryClick() {
refreshListView();
}
private void onBtnUpdateClick() {
String name = etNameToUpdate.getText().toString();
personToUpdate.setName(name);
personDao.update(personToUpdate);
refreshListView();
}
}
小结
至此,已经掌握了 GreenDao 的基本使用。
正如谁说的,开源方便开发人员多于用户,所以 thanks for the author。
回过头想想,目前 GreenDao 带来了那些便利?
1. 只需要构想表结构,GreenDao 会负责创建表和 Dao 层。
2. 正如所有 Orm 框架所提供的,没复杂的更新语句,只有简单的 update(entity)。
3. column 名都以常量形式应用,再也不用担心拼错字段名而头疼奇怪的异常信息。
4. 不需要再为类型疼,比如 Date 和 Boolean 该以什么形式存储。
回到上篇所提到的问题:
1. close 语句去哪了?
2. Dao 的方法都是开启新线程的?