简介
就是这样一个简单的效果,可以通过输入框添加记录,点击列表项时则会删除对应的记录。
准备
https://github.com/greenrobot/greenDAO
到这里下载其中的 DaoExample 子项目,并运行。
我另外写了个 Activity ,实践下 GreenDao 的基本运用。
代码和分析
listview_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:textSize="18dp"
android:paddingLeft="8dp"/>
listView 的项,就是一个 TextView。
ListViewAdapter.java
public class ListViewAdapter extends BaseAdapter {
private List<Note> noteList = new ArrayList<Note>();
private LayoutInflater layoutInflater;
public ListViewAdapter(Activity activity) {
layoutInflater = activity.getLayoutInflater();
}
@Override
public int getCount() {
return noteList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) layoutInflater.inflate(R.layout.listview_item, parent, false);
String text = noteList.get(position).getText();
textView.setText(text);
return textView;
}
public List<Note> getNoteList(){
return noteList;
}
}
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/etNote"
android:layout_weight="1" android:layout_width="0dp"
android:layout_height="match_parent"/>
<Button android:id="@+id/btnAdd"
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 EditText etNote;
private SQLiteDatabase db;
private NoteDao noteDao;
private ListViewAdapter listViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
etNote = (EditText) findViewById(R.id.etNote);
findViewById(R.id.btnAdd).setOnClickListener(this);
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
noteDao = daoSession.getNoteDao();
ListView listView = (ListView) findViewById(R.id.lvNote);
listViewAdapter = new ListViewAdapter(this);
listView.setAdapter(listViewAdapter);
listView.setOnItemClickListener(this);
refreshListView();
}
@Override
public void onClick(View v) {
String text = etNote.getText().toString();
if (!text.equals("")) {
Note note = new Note(null, text, null, null);
noteDao.insert(note);
refreshListView();
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Long keyToDelete = listViewAdapter.getNoteList().get(position).getId();
noteDao.deleteByKey(keyToDelete);
refreshListView();
}
private void refreshListView() {
List<Note> dataFromDb = getDataFromDb();
List<Note> listViewData = listViewAdapter.getNoteList();
listViewData.clear();
listViewData.addAll(dataFromDb);
listViewAdapter.notifyDataSetChanged();
}
private List<Note> getDataFromDb() {
Cursor cursor = db.query(noteDao.getTablename(), noteDao.getAllColumns(), null, null, null, null, null);
List<Note> noteList = new ArrayList<Note>();
while (cursor.moveToNext()) {
Long id = (cursor.getLong(cursor.getColumnIndex(NoteDao.Properties.Id.columnName)));
String text = (cursor.getString(cursor.getColumnIndex(NoteDao.Properties.Text.columnName)));
Note note = new Note(id, text, null, null);
noteList.add(note);
}
return noteList;
}
}
这样一来,对 GreenDao 就算有了个初步的印象了。
但还是有些问题:
1. 我没有看到 db.close 或 cursor.close 的语句,是不需要吗?
2. 操作数据库应该是开启 worker 线程的,使用 NoteDao 时曾抛出异常:
不能在非 UI 线程修改 UI,这真是很奇怪的事情,我又不可能在 NoteDao 的方法中刷新列表。