1
2
3
4
5 |
sourceSets { main { java.srcDirs = [ 'src/main/java' , 'src/main/java-gen' ] } } |
1 |
compile 'de.greenrobot:greendao:1.3.7' |
1 |
compile 'de.greenrobot:greendao-generator:1.3.1' |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
public class ExampleDaoGenerator { public static void main(String[] args) throws Exception { // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。 // 两个参数分别代表:数据库版本号与自动生成代码的包路径。 Schema schema = new Schema(1, "me.itangqi.greendao" ); // 当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示: // Schema schema = new Schema(1, "me.itangqi.bean"); // schema.setDefaultJavaPackageDao("me.itangqi.dao"); // 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。 // schema2.enableActiveEntitiesByDefault(); // schema2.enableKeepSectionsByDefault(); // 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。 addNote(schema); // 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。 // 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。 new DaoGenerator().generateAll(schema, "/Users/tangqi/android-dev/AndroidStudioProjects/MyGreenDAO/app/src/main/java-gen" ); } /** * @param schema */ private static void addNote(Schema schema) { // 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名) Entity note = schema.addEntity( "Note" ); // 你也可以重新给表命名 // note.setTableName("NODE"); // greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值 // 接下来你便可以设置表中的字段: note.addIdProperty(); note.addStringProperty( "text" ).notNull(); // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。 // For example, a property called “creationDate” will become a database column “CREATION_DATE”. note.addStringProperty( "comment" ); note.addDateProperty( "date" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 |
<?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "fill_parent" android:layout_height= "fill_parent" android:orientation= "vertical" > <LinearLayout android:id= "@+id/linearLayout1" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:orientation= "horizontal" > <EditText android:id= "@+id/editTextNote" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_weight= "1" android:hint= "Enter new note" android:inputType= "text" ></EditText> <Button android:id= "@+id/buttonAdd" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:onClick= "onMyButtonClick" android:text= "Add" ></Button> <Button android:id= "@+id/buttonSearch" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:onClick= "onMyButtonClick" android:text= "Search" ></Button> </LinearLayout> <ListView android:id= "@android:id/list" android:layout_width= "fill_parent" android:layout_height= "wrap_content" ></ListView> </LinearLayout> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 |
public class NoteActivity extends ListActivity { private SQLiteDatabase db; private EditText editText; private DaoMaster daoMaster; private DaoSession daoSession; private Cursor cursor; public static final String TAG = "DaoExample" ; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_note); // 官方推荐将获取 DaoMaster 对象的方法放到 Application 层,这样将避免多次创建生成 Session 对象 setupDatabase(); // 获取 NoteDao 对象 getNoteDao(); String textColumn = NoteDao.Properties.Text.columnName; String orderBy = textColumn + " COLLATE LOCALIZED ASC" ; cursor = db.query(getNoteDao().getTablename(), getNoteDao().getAllColumns(), null , null , null , null , orderBy); String[] from = {textColumn, NoteDao.Properties.Comment.columnName}; int[] to = {android.R.id.text1, android.R.id.text2}; SimpleCursorAdapter adapter = new SimpleCursorAdapter( this , android.R.layout.simple_list_item_2, cursor, from, to); setListAdapter(adapter); editText = (EditText) findViewById(R.id.editTextNote); } private void setupDatabase() { // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。 // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。 // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。 // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。 DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper( this , "notes-db" , null ); db = helper.getWritableDatabase(); // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。 daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); } private NoteDao getNoteDao() { return daoSession.getNoteDao(); } /** * Button 点击的监听事件 * * @param view */ public void onMyButtonClick(View view) { switch (view.getId()) { case R.id.buttonAdd: addNote(); break ; case R.id.buttonSearch: search(); break ; default : Log.d(TAG, "what has gone wrong ?" ); break ; } } private void addNote() { String noteText = editText.getText().toString(); editText.setText( "" ); final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); String comment = "Added on " + df.format( new Date()); // 插入操作,简单到只要你创建一个 Java 对象 Note note = new Note( null , noteText, comment, new Date()); getNoteDao().insert(note); Log.d(TAG, "Inserted new note, ID: " + note.getId()); cursor.requery(); } private void search() { // Query 类代表了一个可以被重复执行的查询 Query query = getNoteDao().queryBuilder() .where(NoteDao.Properties.Text.eq( "Test1" )) .orderAsc(NoteDao.Properties.Date) .build(); // 查询结果以 List 返回 // List notes = query.list(); // 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值 QueryBuilder.LOG_SQL = true ; QueryBuilder.LOG_VALUES = true ; } /** * ListView 的监听事件,用于删除一个 Item * @param l * @param v * @param position * @param id */ @Override protected void onListItemClick(ListView l, View v, int position, long id) { // 删除操作,你可以通过「id」也可以一次性删除所有 getNoteDao().deleteByKey(id); // getNoteDao().deleteAll(); Log.d(TAG, "Deleted note, ID: " + id); cursor.requery(); } } |