我目前正在开发一个关于Android内容提供商的简单程序。我使用SQLite数据库创建了自己的内容提供者,我在其中存储和处理朋友的生日。应用程序运行正常,但当我添加生日时,应用程序崩溃。但是,当我再次启动应用程序时,我可以显示从另一种方法showMybirthDays()
添加的生日。
public void addTheBirthday(View v) {
ContentValues values = new ContentValues();
values.put(MyBirthProvider.NAME,
((EditText)findViewById(R.id.name)).getText().toString());
values.put(MyBirthProvider.BIRTHDAY,
((EditText) findViewById(R.id.birthday)).getText().toString());
Uri uri = getContentResolver().insert(MyBirthProvider.MYCONTENT_URI, v);
Toast.makeText(this, uri.toString() + "inserted!", Toast.LENGTH_LONG).show();
}
我尝试了没有uri.toString()
的吐司,但它确实有效。所以问题是uri.toString()
,但我无法找到我做错的地方? - 我卡住了
非常感谢任何帮助。感谢。
这是我的CONTENT_URI
:
static final String URL = "content://" + MYPROVIDER_NAME + "/myfriends/" + ID;
static final Uri MYCONTENT_URI = Uri.parse(URL);
这是我的提供者:
public class MyBirthProvider extends ContentProvider {
static final String ID = "id";
static final String NAME = "name";
static final String BIRTHDAY = "birthday";
static final String PROVIDER_NAME = "com.example.test.provider.Birthday";
static final String URL = "content://" + MYPROVIDER_NAME + "/myfriends/" + ID;
static final Uri MYCONTENT_URI = Uri.parse(URL);
static final int FRIENDS = 1;
static final int FRIENDS_ID = 2;
DBHelper dbHelper;
private static HashMap<String, String> BirthMap;
static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "friends", FRIENDS);
uriMatcher.addURI(PROVIDER_NAME, "friends/#", FRIENDS_ID);
}
private SQLiteDatabase database;
static final String DATABASE_NAME = "MyBirthdayReminder";
static final String TABLE_NAME = "mybirthTable";
static final int DATABASE_VERSION = 1;
static final String CREATE_TABLE = " CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" name TEXT NOT NULL, " + " birthday TEXT NOT NULL);";
private static class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
// TODO Auto-generated constructor stub
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
// TODO Auto-generated constructor stub
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
// TODO Auto-generated constructor stub
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
Log.w(DBHelper.class.getName(), "Upgrading database frim version " + oldVersion + " to "
+ newVersion + " .Old data will be destroyed");
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(sqLiteDatabase);
}
}
@Override
public boolean onCreate() {
Context c = getContext();
dbHelper = new DBHelper(c);
database = dbHelper.getWritableDatabase();
if (database == null)
return false;
else
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(TABLE_NAME);
switch (uriMatcher.match(uri)) {
case FRIENDS:
qb.setProjectionMap(BirthMap);
break;
case FRIENDS_ID:
qb.appendWhere(ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI" + uri);
}
if (sortOrder == null || sortOrder == "") {
sortOrder = NAME;
}
Cursor cursor = qb.query(database, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long row = database.insert(TABLE_NAME, "", values);
if (row > 0) {
Uri newUri = ContentUris.withAppendedId(MYCONTENT_URI, row);
getContext().getContentResolver().notifyChange(newUri, null);
return null;
}
throw new SQLException("Fail to add a new record into " + uri);
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)) {
case FRIENDS:
count = database.update(TABLE_NAME, values, ID + " = " + uri.getLastPathSegment() +
(!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)) {
case FRIENDS:
count = database.delete(TABLE_NAME, selection, selectionArgs);
break;
case FRIENDS_ID:
String id = uri.getLastPathSegment(); //gets the id
count = database.delete(TABLE_NAME, ID + " = " + id + (!TextUtils.isEmpty(selection)
? " AND (" + selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case FRIENDS:
return "vnd.android.cursor.dir/vnd.example.friends";
case FRIENDS_ID:
return "vnd.android.cursor.dir/vnd.example.friends";
default:
throw new IllegalArgumentException("Unsupported URI " + uri);
}
}
}