-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
content-provider.ftl
221 lines (198 loc) · 8.01 KB
/
content-provider.ftl
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<#-- @ftlvariable name="entity" type="org.greenrobot.greendao.generator.Entity" -->
<#-- @ftlvariable name="contentProvider" type="org.greenrobot.greendao.generator.ContentProvider" -->
<#-- @ftlvariable name="schema" type="org.greenrobot.greendao.generator.Schema" -->
package ${contentProvider.javaPackage};
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import org.greenrobot.greendao.DaoLog;
import org.greenrobot.greendao.database.StandardDatabase;
import org.greenrobot.greendao.database.Database;
import ${schema.defaultJavaPackageDao}.${schema.prefix}DaoSession;
import ${entity.javaPackageDao}.${entity.classNameDao};
/* Copy this code snippet into your AndroidManifest.xml inside the <application> element:
<provider
android:name="${contentProvider.javaPackage}.${contentProvider.className}"
android:authorities="${contentProvider.authority}" />
*/
public class ${contentProvider.className} extends ContentProvider {
public static final String AUTHORITY = "${contentProvider.authority}";
public static final String BASE_PATH = "${contentProvider.basePath}";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH);
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/" + BASE_PATH;
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/" + BASE_PATH;
private static final String TABLENAME = ${entity.classNameDao}.TABLENAME;
private static final String PK = ${entity.classNameDao}.Properties.${entity.pkProperty.propertyName?cap_first}.columnName;
<#assign counter = 0>
private static final int ${entity.className?upper_case}_DIR = ${counter};
private static final int ${entity.className?upper_case}_ID = ${counter+1};
private static final UriMatcher sURIMatcher;
static {
sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sURIMatcher.addURI(AUTHORITY, BASE_PATH, ${entity.className?upper_case}_DIR);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", ${entity.className?upper_case}_ID);
}
/**
* This must be set from outside, it's recommended to do this inside your Application object.
* Subject to change (static isn't nice).
*/
public static ${schema.prefix}DaoSession daoSession;
@Override
public boolean onCreate() {
// if(daoSession == null) {
// throw new IllegalStateException("${schema.prefix}DaoSession must be set before content provider is created");
// }
DaoLog.d("Content Provider started: " + CONTENT_URI);
return true;
}
protected Database getDatabase() {
if(daoSession == null) {
throw new IllegalStateException("${schema.prefix}DaoSession must be set during content provider is active");
}
return daoSession.getDatabase();
}
<#--
##########################################
########## Insert ##############
##########################################
-->
@Override
public Uri insert(Uri uri, ContentValues values) {
<#if contentProvider.isReadOnly()>
throw new UnsupportedOperationException("This content provider is readonly");
<#else>
int uriType = sURIMatcher.match(uri);
long id = 0;
String path = "";
switch (uriType) {
case ${entity.className?upper_case}_DIR:
id = getDatabase().insert(TABLENAME, null, values);
path = BASE_PATH + "/" + id;
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse(path);
</#if>
}
<#--
##########################################
########## Delete ##############
##########################################
-->
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
<#if contentProvider.isReadOnly()>
throw new UnsupportedOperationException("This content provider is readonly");
<#else>
int uriType = sURIMatcher.match(uri);
Database db = getDatabase();
int rowsDeleted = 0;
String id;
switch (uriType) {
case ${entity.className?upper_case}_DIR:
rowsDeleted = db.delete(TABLENAME, selection, selectionArgs);
break;
case ${entity.className?upper_case}_ID:
id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsDeleted = db.delete(TABLENAME, PK + "=" + id, null);
} else {
rowsDeleted = db.delete(TABLENAME, PK + "=" + id + " and "
+ selection, selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
</#if>
}
<#--
##########################################
########## Update ##############
##########################################
-->
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
<#if contentProvider.isReadOnly()>
throw new UnsupportedOperationException("This content provider is readonly");
<#else>
int uriType = sURIMatcher.match(uri);
Database db = getDatabase();
int rowsUpdated = 0;
String id;
switch (uriType) {
case ${entity.className?upper_case}_DIR:
rowsUpdated = db.update(TABLENAME, values, selection, selectionArgs);
break;
case ${entity.className?upper_case}_ID:
id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsUpdated = db.update(TABLENAME, values, PK + "=" + id, null);
} else {
rowsUpdated = db.update(TABLENAME, values, PK + "=" + id
+ " and " + selection, selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
</#if>
}
<#--
##########################################
########## Query ##############
##########################################
-->
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case ${entity.className?upper_case}_DIR:
queryBuilder.setTables(TABLENAME);
break;
case ${entity.className?upper_case}_ID:
queryBuilder.setTables(TABLENAME);
queryBuilder.appendWhere(PK + "="
+ uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
Database db = getDatabase();
Cursor cursor = queryBuilder.query(((StandardDatabase) db).getSQLiteDatabase(), projection, selection,
selectionArgs, null, null, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
<#--
##########################################
########## GetType ##############
##########################################
-->
@Override
public final String getType(Uri uri) {
switch (sURIMatcher.match(uri)) {
case ${entity.className?upper_case}_DIR:
return CONTENT_TYPE;
case ${entity.className?upper_case}_ID:
return CONTENT_ITEM_TYPE;
default :
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
}