· 6 years ago · Jul 23, 2019, 03:02 AM
12019-07-23 10:42:05.177 22188-22188/com.example.contentresolver E/AndroidRuntime: FATAL EXCEPTION: main
2 Process: com.example.contentresolver, PID: 22188
3 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.contentresolver/com.example.contentresolver.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.content.ContentResolver.query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)' on a null object reference
4 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3260)
5 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396)
6 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
7 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
8 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
9 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009)
10 at android.os.Handler.dispatchMessage(Handler.java:107)
11 at android.os.Looper.loop(Looper.java:214)
12 at android.app.ActivityThread.main(ActivityThread.java:7319)
13 at java.lang.reflect.Method.invoke(Native Method)
14 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
15 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
16 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.content.ContentResolver.query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)' on a null object reference
17 at com.example.contentresolver.MainActivity.getContacts(MainActivity.java:36)
18 at com.example.contentresolver.MainActivity.onCreate(MainActivity.java:26)
19 at android.app.Activity.performCreate(Activity.java:7783)
20 at android.app.Activity.performCreate(Activity.java:7772)
21 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
22 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3235)
23 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396)
24 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
25 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
26 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
27 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009)
28 at android.os.Handler.dispatchMessage(Handler.java:107)
29 at android.os.Looper.loop(Looper.java:214)
30 at android.app.ActivityThread.main(ActivityThread.java:7319)
31 at java.lang.reflect.Method.invoke(Native Method)
32 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
33 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
34
35package com.example.servicesbroadcastcontentdemo;
36
37import android.content.*;
38import android.database.Cursor;
39import android.database.sqlite.SQLiteDatabase;
40import android.database.sqlite.SQLiteOpenHelper;
41import android.database.sqlite.SQLiteQueryBuilder;
42import android.net.Uri;
43import android.widget.Toast;
44
45import java.util.HashMap;
46
47public class MyContentProvider extends ContentProvider {
48
49 public static final String PROVIDER_NAME = "com.example.servicesbroadcastcontentdemo.MyContentProvider";
50 static final String URL = "content://" + PROVIDER_NAME + "/contents";
51 static final Uri CONTENT_URL = Uri.parse(URL);
52
53 static final String id = "id";
54 static final String name = "name";
55 static final int uriCode = 1;
56
57 private static HashMap<String, String> values;
58
59 static final UriMatcher uriMatcher;
60
61 static{
62 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
63 uriMatcher.addURI(PROVIDER_NAME,"contents", uriCode);
64 }
65
66 private SQLiteDatabase sqlDB;
67 static final String DATABASE_NAME = "myContents";
68 static final String TABLE_NAME = "names";
69 static final int DATABASE_VERSION = 1;
70
71 static final String CREATE_DB_TABLE = "CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, "
72 + " name TEXT NOT NULL);";
73
74 @Override
75 public boolean onCreate() {
76 DatabaseHelper dbHelper = new DatabaseHelper(getContext());
77 sqlDB = dbHelper.getWritableDatabase();
78
79 if (sqlDB != null){
80 return true;
81 }
82 return false;
83 }
84
85 @Override
86 public int delete(Uri uri, String selection, String[] selectionArgs) {
87
88 int rowsDeleted = 0;
89
90 switch (uriMatcher.match(uri)){
91 case uriCode:
92 rowsDeleted = sqlDB.delete(TABLE_NAME, selection, selectionArgs);
93 break;
94 default:
95 throw new IllegalArgumentException("Unknown URI: " + uri);
96
97 }
98
99 getContext().getContentResolver().notifyChange(uri, null);
100 return rowsDeleted;
101 }
102
103 @Override
104 public String getType(Uri uri) {
105 switch (uriMatcher.match(uri)){
106 case uriCode:
107 return "vnd.android.cursor.dir/contents";
108 default:
109 throw new IllegalArgumentException("Unknown URI: " + uri);
110
111 }
112 }
113
114 @Override
115 public Uri insert(Uri uri, ContentValues values) {
116 long rowID = sqlDB.insert(TABLE_NAME, null, values);
117
118 if (rowID > 0){
119 Uri _uri = ContentUris.withAppendedId(CONTENT_URL, rowID);
120 getContext().getContentResolver().notifyChange(_uri, null);
121 return _uri;
122 } else {
123 Toast.makeText(getContext(), "Row insert failed", Toast.LENGTH_SHORT).show();
124 return null;
125 }
126 }
127
128
129 @Override
130 public Cursor query(Uri uri, String[] projection, String selection,
131 String[] selectionArgs, String sortOrder) {
132 SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
133
134 queryBuilder.setTables(TABLE_NAME);
135
136 switch (uriMatcher.match(uri)){
137 case uriCode:
138 queryBuilder.setProjectionMap(values);
139 break;
140 default:
141 throw new IllegalArgumentException("Unknown URI: " + uri);
142
143 }
144
145 Cursor cursor = queryBuilder.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder);
146 cursor.setNotificationUri(getContext().getContentResolver(), uri);
147 return cursor;
148 }
149
150 @Override
151 public int update(Uri uri, ContentValues values, String selection,
152 String[] selectionArgs) {
153 int rowsUpdated = 0;
154
155 switch (uriMatcher.match(uri)){
156 case uriCode:
157 rowsUpdated = sqlDB.update(TABLE_NAME, values, selection, selectionArgs);
158 break;
159 default:
160 throw new IllegalArgumentException("Unknown URI: " + uri);
161
162 }
163
164 getContext().getContentResolver().notifyChange(uri, null);
165 return rowsUpdated;
166 }
167
168 private static class DatabaseHelper extends SQLiteOpenHelper{
169 public DatabaseHelper(Context context) {
170 super(context, DATABASE_NAME, null, DATABASE_VERSION);
171 }
172
173 @Override
174 public void onCreate(SQLiteDatabase sqLiteDatabase) {
175 sqLiteDatabase.execSQL(CREATE_DB_TABLE);
176 }
177
178 @Override
179 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
180 sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
181 onCreate(sqLiteDatabase);
182 }
183 }
184}
185
186package com.example.contentresolver;
187
188import androidx.appcompat.app.AppCompatActivity;
189
190import android.content.ContentResolver;
191import android.database.Cursor;
192import android.net.Uri;
193import android.os.Bundle;
194import android.widget.TextView;
195
196public class MainActivity extends AppCompatActivity {
197
198 static final Uri CONTENT_URL =
199 Uri.parse("content://com.example.servicesbroadcastcontentdemo.MyContentProvider/cpcontacts");
200
201 TextView contacts = null;
202
203 ContentResolver resolver;
204 @Override
205 protected void onCreate(Bundle savedInstanceState) {
206 super.onCreate(savedInstanceState);
207 setContentView(R.layout.activity_main);
208
209 contacts = (TextView) findViewById(R.id.textView);
210
211 getContacts();
212 }
213
214
215 public void getContacts(){
216
217 // Projection contains the columns we want
218 String[] projection = new String[]{"id", "name"};
219
220 // Pass the URL, projection and I'll cover the other options below
221 Cursor cursor = resolver.query(CONTENT_URL, projection, null, null, null);
222
223 String contactList = "";
224
225 // Cycle through and display every row of data
226 if(cursor.moveToFirst()){
227
228 do{
229
230 String id = cursor.getString(cursor.getColumnIndex("id"));
231 String name = cursor.getString(cursor.getColumnIndex("name"));
232
233 contactList = contactList + id + " : " + name + "n";
234
235 }while (cursor.moveToNext());
236
237 }
238
239 contacts.setText(contactList);
240
241 }
242}