1.配置
root build.gradle
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.1'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}
复制代码
app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
dependencies {
implementation 'org.greenrobot:greendao:3.2.2' // add library
}
复制代码
app/build.gradle内与dependencies{}同级别位置添加
greendao {
schemaVersion 1
daoPackage 'com.smilemolj.greendaodemotest.db'
targetGenDir 'src/main/java'
}
复制代码
2.bean类
@Entity(indexes = {
@Index(value = "text, date DESC", unique = true)
})
public class Note {
@Id
private Long id;
@NotNull
private String text;
private String comment;
private java.util.Date date;
@Convert(converter = NoteTypeConverter.class, columnType = String.class)
private NoteType type;
复制代码
NoteTypeConverter
public class NoteTypeConverter implements PropertyConverter<NoteType, String> {
@Override
public NoteType convertToEntityProperty(String databaseValue) {
return NoteType.valueOf(databaseValue);
}
@Override
public String convertToDatabaseValue(NoteType entityProperty) {
return entityProperty.name();
}
}
复制代码
NoteType
public enum NoteType {
TEXT, LIST, PICTURE
}
复制代码
3.make project
编译一下工程 。如果配置正确,会在配置的包目录下自动会生成 DaoMaster,DaoSession 和 NoteDao 类 。
4.继承Application类
public class App extends Application {
private DaoMaster.DevOpenHelper mHelper;
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
public static App instance = null;
@Override
public void onCreate() {
super.onCreate();
instance = this;
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
db = mHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
public SQLiteDatabase getDb() {
return db;
}
public DaoSession getDaoSession() {
return daoSession;
}
public static App getInstance() {
if (instance == null) {
synchronized (App.class) {
//同步
if (instance == null) {
instance = new App();
}
}
}
return instance;
}
}
复制代码
5.修改AndroidManifest.xml文件
application节点内添加
android:name=".App"
复制代码
6.activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:paddingBottom="@dimen/sp_16"
android:paddingLeft="@dimen/sp_16"
android:paddingRight="@dimen/sp_16"
android:paddingTop="@dimen/sp_16"
tools:context=".MainActivity">
<Button
android:id="@+id/buttonAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="onAddButtonClick"
android:text="添加"/>
<EditText
android:id="@+id/editTextNote"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/buttonAdd"
android:hint="输入新笔记"
android:imeOptions="actionDone"
android:inputType="text"/>
<TextView
android:id="@+id/textViewNoteInstructions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/editTextNote"
android:gravity="center_horizontal"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="点击删除对应笔记"
android:textSize="12sp"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewNotes"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/textViewNoteInstructions"
android:scrollbars="vertical"/>
</RelativeLayout>
复制代码
7.item_note.xml
<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/textViewNoteText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
tools:text="Note Text" />
<TextView
android:id="@+id/textViewNoteComment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
tools:text="Note Comment" />
</LinearLayout>
复制代码
8.NotesAdapter
public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NoteViewHolder> {
private NoteClickListener clickListener;
private List<Note> dataset;
public interface NoteClickListener {
void onNoteClick(int position);
}
static class NoteViewHolder extends RecyclerView.ViewHolder {
public TextView text;
public TextView comment;
public NoteViewHolder(View itemView, final NoteClickListener clickListener) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.textViewNoteText);
comment = (TextView) itemView.findViewById(R.id.textViewNoteComment);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (clickListener != null) {
clickListener.onNoteClick(getAdapterPosition());
}
}
});
}
}
public NotesAdapter(NoteClickListener clickListener) {
this.clickListener = clickListener;
this.dataset = new ArrayList<Note>();
}
public void setNotes(@NonNull List<Note> notes) {
dataset = notes;
notifyDataSetChanged();
}
public Note getNote(int position) {
return dataset.get(position);
}
@Override
public NotesAdapter.NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_note, parent, false);
return new NoteViewHolder(view, clickListener);
}
@Override
public void onBindViewHolder(NotesAdapter.NoteViewHolder holder, int position) {
Note note = dataset.get(position);
holder.text.setText(note.getText());
holder.comment.setText(note.getComment());
}
@Override
public int getItemCount() {
return dataset.size();
}
}
复制代码
9.MainActivity
public class MainActivity extends AppCompatActivity {
private EditText editText;
private View addNoteButton;
private RxDao<Note, Long> noteDao;
private RxQuery<Note> notesQuery;
private NotesAdapter notesAdapter;
NotesAdapter.NoteClickListener noteClickListener = new NotesAdapter.NoteClickListener() {
@Override
public void onNoteClick(int position) {
Note note = notesAdapter.getNote(position);
final Long noteId = note.getId();
noteDao.deleteByKey(noteId)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
Toast.makeText(MainActivity.this, "Deleted note, ID: " + noteId, Toast.LENGTH_SHORT).show();
updateNotes();
}
});
}
};
// oncreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recyclerViewNotes);
//noinspection ConstantConditions
recyclerView.setLayoutManager(new LinearLayoutManager(this));
notesAdapter = new NotesAdapter(noteClickListener);
recyclerView.setAdapter(notesAdapter);
addNoteButton = findViewById(R.id.buttonAdd);
editText = findViewById(R.id.editTextNote);
RxTextView.editorActions(editText).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer actionId) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
String noteText = editText.getText().toString();
editText.setText("");
final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
String comment = "Added on " + df.format(new Date());
Note note = new Note(null, noteText, comment, new Date(), NoteType.TEXT);
noteDao.insert(note)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Note>() {
@Override
public void call(Note note) {
Toast.makeText(MainActivity.this, "Inserted new note, ID: " + note.getId(), Toast.LENGTH_SHORT).show();
updateNotes();
}
});
}
}
});
RxTextView.afterTextChangeEvents(editText).observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<TextViewAfterTextChangeEvent>() {
@Override
public void call(TextViewAfterTextChangeEvent textViewAfterTextChangeEvent) {
boolean enable = textViewAfterTextChangeEvent.editable().length() > 0;
addNoteButton.setEnabled(enable);
}
});
// get the Rx variant of the note DAO
DaoSession daoSession = App.getInstance().getDaoSession();
noteDao = daoSession.getNoteDao().rx();
// query all notes, sorted a-z by their text
notesQuery = daoSession.getNoteDao().queryBuilder().orderAsc(NoteDao.Properties.Text).rx();
updateNotes();
}
// oncreate()
private void updateNotes() {
notesQuery.list()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Note>>() {
@Override
public void call(List<Note> notes) {
notesAdapter.setNotes(notes);
}
});
}
public void onAddButtonClick(View view) {
String noteText = editText.getText().toString();
editText.setText("");
final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
String comment = "Added on " + df.format(new Date());
Note note = new Note(null, noteText, comment, new Date(), NoteType.TEXT);
noteDao.insert(note)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Note>() {
@Override
public void call(Note note) {
Toast.makeText(MainActivity.this, "Inserted new note, ID: " + note.getId(), Toast.LENGTH_SHORT).show();
updateNotes();
}
});
}
}
复制代码