It seems that you're assigning twice to sUriMatcher in the two static initializer blocks at the end of the CodesContentProvider class.
Up vote 0 down vote favorite share g+ share fb share tw.
I am trying to create my own content provider for the first time and am having trouble figuring out what I have done wrong. When I run the test code at the bottom, I am getting an unknown URI exception and, for the life of me, I can't figure out what's wrong. Any help would be greatly appreciated.
CodesContentProvider. Java public class CodesContentProvider extends ContentProvider { private static final String TAG = "CodesContentProvider"; private static String DATABASE_NAME; private static final int DATABASE_VERSION = 1; private static final String CODES_TABLE_NAME = "codes"; private static final String TITLES_TABLE_NAME = "titles"; public static final String AUTHORITY = "com.xxx.capenal.providers. CodesContentProvider"; private static UriMatcher sUriMatcher; private static final int CODES = 1; private static final int TITLES = 2; private static SQLiteDatabase mDatabase = null; private static HashMap codesProjectionMap; private static HashMap titlesProjectionMap; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); File path; final File DataDirectory; path = Environment.
GetExternalStorageDirectory(); DataDirectory = new File(path,context. GetString(R.string. DATABASE_DIRECTORY)); DATABASE_NAME = new File(DataDirectory, context.
GetString(R.string. DATABASE_FILE_NAME)).toString(); } @Override public void onCreate(SQLiteDatabase db) { //TODO: Add titles to this statement db. ExecSQL("CREATE TABLE " + CODES_TABLE_NAME + " (" + Codes.
CODE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Codes. PARENT_ID + " VARCHAR(255)," + Codes. CODE + " LONGTEXT" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.
W(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db. ExecSQL("DROP TABLE IF EXISTS " + CODES_TABLE_NAME); onCreate(db); } @Override public synchronized SQLiteDatabase getReadableDatabase() { try { return getWritableDatabase(); } catch (SQLiteException e) { //Log. E("", "Couldn't open " + DATABASE_NAME + " for writing (will try read-only):", e); } SQLiteDatabase db = null; try { //mIsInitializing = true; db = SQLiteDatabase.
OpenDatabase(DATABASE_NAME, null, SQLiteDatabase. OPEN_READONLY); if (db.getVersion()! = DATABASE_VERSION) { throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " + DATABASE_VERSION + ": " + DATABASE_NAME); } onOpen(db); mDatabase = db; return mDatabase; } finally { //mIsInitializing = false; if (db!
= null && db! = mDatabase) db.close(); } } @Override public synchronized SQLiteDatabase getWritableDatabase() { boolean success = false; SQLiteDatabase db = null; // if (mDatabase! = null) mDatabase.lock(); //can't call the locks for // some reason.
BeginTransaction does lock it though try { //mIsInitializing = true; db = SQLiteDatabase. OpenOrCreateDatabase(DATABASE_NAME, null); int version = db.getVersion(); if (version! = DATABASE_VERSION) { db.
BeginTransaction(); try { if (version == 0) { onCreate(db); } else { onUpgrade(db, version, DATABASE_VERSION); } db. SetVersion(DATABASE_VERSION); db. SetTransactionSuccessful(); } finally { db.endTransaction(); } } onOpen(db); success = true; return db; } finally { // mIsInitializing = false; if (success) { if (mDatabase!
= null) { try { mDatabase.close(); } catch (Exception e) { } // mDatabase.unlock(); } mDatabase = db; } else { // if (mDatabase! = null) mDatabase.unlock(); if (db! = null) db.close(); } } } } private DatabaseHelper dbHelper; @Override public int delete(Uri uri, String where, String whereArgs) { SQLiteDatabase db = dbHelper.
GetWritableDatabase(); int count; switch (sUriMatcher. Match(uri)) { case CODES: count = db. Delete(CODES_TABLE_NAME, where, whereArgs); break; case TITLES: count = db.
Delete(TITLES_TABLE_NAME, where, whereArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext(). GetContentResolver(). NotifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (sUriMatcher.
Match(uri)) { case CODES: return Codes. CONTENT_TYPE; case TITLES: return Titles. CONTENT_TYPE; default: throw new IllegalArgumentException("Unknown URI " + uri); } } @Override public Uri insert(Uri uri, ContentValues initialValues) { if (sUriMatcher.
Match(uri)! = CODES) { throw new IllegalArgumentException("Unknown URI " + uri); } ContentValues values; if (initialValues! = null) { values = new ContentValues(initialValues); } else { values = new ContentValues(); } SQLiteDatabase db = dbHelper.
GetWritableDatabase(); long rowId = db. Insert(CODES_TABLE_NAME, Codes. DEFINITION, values); if (rowId > 0) { Uri CodeUri = ContentUris.
WithAppendedId(Codes. CONTENT_URI, rowId); getContext(). GetContentResolver().
NotifyChange(CodeUri, null); return CodeUri; } throw new SQLException("Failed to insert row into " + uri); } @Override public boolean onCreate() { dbHelper = new DatabaseHelper(getContext()); return true; } @Override public Cursor query(Uri uri, String projection, String selection, String selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); switch (sUriMatcher. Match(uri)) { case CODES: qb. SetTables(CODES_TABLE_NAME); qb.
SetProjectionMap(codesProjectionMap); break; case TITLES: qb. SetTables(TITLES_TABLE_NAME); qb. SetProjectionMap(titlesProjectionMap); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } SQLiteDatabase db = dbHelper.
GetReadableDatabase(); Cursor c = qb. Query(db, projection, selection, selectionArgs, null, null, sortOrder); c. SetNotificationUri(getContext().
GetContentResolver(), uri); return c; } @Override public int update(Uri uri, ContentValues values, String where, String whereArgs) { SQLiteDatabase db = dbHelper. GetWritableDatabase(); int count; switch (sUriMatcher. Match(uri)) { case CODES: count = db.
Update(CODES_TABLE_NAME, values, where, whereArgs); break; case TITLES: count = db. Update(TITLES_TABLE_NAME, values, where, whereArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext(). GetContentResolver().
NotifyChange(uri, null); return count; } static { sUriMatcher = new UriMatcher(UriMatcher. NO_MATCH); sUriMatcher. AddURI(AUTHORITY, CODES_TABLE_NAME, CODES); codesProjectionMap = new HashMap(); codesProjectionMap.
Put(Codes. CODE_ID, Codes. CODE_ID); codesProjectionMap.
Put(Codes. PARENT_ID, Codes. PARENT_ID); codesProjectionMap.
Put(Codes. CODE, Codes. CODE); codesProjectionMap.
Put(Codes. DEFINITION, Codes. DEFINITION); codesProjectionMap.
Put(Codes. EXCERPT, Codes. EXCERPT); } static { sUriMatcher = new UriMatcher(UriMatcher.
NO_MATCH); sUriMatcher. AddURI(AUTHORITY, TITLES_TABLE_NAME, TITLES); titlesProjectionMap = new HashMap(); titlesProjectionMap. Put(Titles.
TYPE, Titles. TYPE); titlesProjectionMap. Put(Titles.
SECTION, Titles. SECTION); titlesProjectionMap. Put(Titles.
FULL_TITLE, Titles. FULL_TITLE); titlesProjectionMap. Put(Titles.
TITLE, Titles. TITLE); titlesProjectionMap. Put(Titles.
TITLE_ID, Titles. TITLE_ID); titlesProjectionMap. Put(Titles.
PARENT_ID, Titles. PARENT_ID); titlesProjectionMap. Put(Titles.
CODE_RANGE, Titles. CODE_RANGE); } } public class Code { public Code() { } public static final class Codes implements BaseColumns { private Codes() { } public static final Uri CONTENT_URI = Uri. Parse("content://" + CodesContentProvider.
AUTHORITY + "/codes"); public static final String CONTENT_TYPE = "vnd.android.cursor. Dir/vnd.xxx. Codes"; public static final String CODE_ID = "_id"; public static final String PARENT_ID = "parent_id"; public static final String CODE = "code"; public static final String DEFINITION = "definition"; public static final String EXCERPT = "excerpt"; } } Test Code: // Form an array specifying which columns to return.
String projection = new String { Codes. _ID, Codes. CODE_ID, Codes.
PARENT_ID, Codes. EXCERPT }; // Get the base URI for the People table in the Contacts content provider. Uri codes = Codes.
CONTENT_URI; // Make the query. Cursor managedCursor = managedQuery(codes, projection, // Which columns to return null, // Which rows to return (all rows) null, // Selection arguments (none) // Put the results in ascending order by name Codes. CODE_ID + " ASC"); Stack Trace: 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): FATAL EXCEPTION: main 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): java.lang.
RuntimeException: Unable to pause activity {com.xxx. Capenal/com.xxx.capenal. Main}: java.lang.
RuntimeException: Unable to pause activity {com.xxx. Capenal/com.xxx.capenal. Parent}: java.lang.
IllegalArgumentException: Unknown URI content://com.xxx.capenal.providers. CodesContentProvider/codes/23 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. PerformPauseActivity(ActivityThread.
Java:2487) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. PerformPauseActivity(ActivityThread. Java:2444) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread.
HandlePauseActivity(ActivityThread. Java:2422) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. Access$1700(ActivityThread.
Java:122) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app. ActivityThread$H. HandleMessage(ActivityThread.
Java:1009) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.os.Handler. DispatchMessage(Handler. Java:99) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.os.Looper.
Loop(Looper. Java:132) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. Main(ActivityThread.
Java:4025) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at java.lang.reflect.Method. InvokeNative(Native Method) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at java.lang.reflect.Method. Invoke(Method.
Java:491) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at com.android.internal.os. ZygoteInit$MethodAndArgsCaller. Run(ZygoteInit.
Java:841) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at com.android.internal.os.ZygoteInit. Main(ZygoteInit. Java:599) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at dalvik.system.NativeStart.
Main(Native Method) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): Caused by: java.lang. RuntimeException: Unable to pause activity {com.xxx. Capenal/com.xxx.capenal.
Parent}: java.lang. IllegalArgumentException: Unknown URI content://com.xxx.capenal.providers. CodesContentProvider/codes/23 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread.
PerformPauseActivity(ActivityThread. Java:2487) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. PerformPauseActivity(ActivityThread.
Java:2444) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app. LocalActivityManager. PerformPause(LocalActivityManager.
Java:203) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app. LocalActivityManager. MoveToState(LocalActivityManager.
Java:187) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app. LocalActivityManager. DispatchPause(LocalActivityManager.
Java:547) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityGroup. OnPause(ActivityGroup. Java:73) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.Activity.
PerformPause(Activity. Java:4452) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.Instrumentation. CallActivityOnPause(Instrumentation.
Java:1194) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread. PerformPauseActivity(ActivityThread. Java:2474) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): ... 12 more 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): Caused by: java.lang.
IllegalArgumentException: Unknown URI content://com.xxx.capenal.providers. CodesContentProvider/codes/23 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at com.xxx.capenal.providers. CodesContentProvider.
Query(CodesContentProvider. Java:241) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.content. ContentProvider$Transport.
Query(ContentProvider. Java:192) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.content.ContentResolver. Query(ContentResolver.
Java:302) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.Activity. ManagedQuery(Activity. Java:1670) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at com.xxx.capenal.parent.
OnPause(parent. Java:160) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.Activity. PerformPause(Activity.
Java:4452) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.Instrumentation. CallActivityOnPause(Instrumentation. Java:1194) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): at android.app.ActivityThread.
PerformPauseActivity(ActivityThread. Jav a:2474) 05-17 17:49:48.959: ERROR/AndroidRuntime(22769): ... 20 more android contentprovider link|improve this question edited 05-17 at 10:02Luksprog6,6863616 asked 05-17 at 2:33Michael Little138213 71% accept rate.
To me, it seems that you're assigning twice to sUriMatcher in the two static initializer blocks at the end of the CodesContentProvider class. – Ionu? G.
Stan May 18 '11 at 3:05 You were absolutely correct. I don't know how I thought that would have worked. Would you mind making this an answer so I can give you credit?
– Michael Little May 18 '11 at 4:13 Sure, thanks. (15 chars) – Ionu? G.
Stan May 18 '11 at 5:32.
I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.