GreenDao 学习笔记 2


简介


上一篇中,我使用已生成的 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 的方法都是开启新线程的?








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值