当我检查Checkbox以保存一个项目时,应用程序崩溃了,我试图制作一些断点来测试代码,然后他们成功运行了。 我不知道问题出在哪里,所以这里是我处理复选框的方法。(首先尝试检查复选框,稍后检查未选中状态)
我是初学基于java基础知识的android开发,所以任何解释都会有所帮助,谢谢你提前
buttonFavorite = (CheckBox) findViewById(R.id.favButton);
buttonFavorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (buttonFavorite.isChecked()){
Uri mNewUri;
ContentValues values = new ContentValues();
values.put(MovieContract.MovieEntry.COLUMN_ID_MOVIE, movieId );
values.put(MovieContract.MovieEntry.COLUMN_TITLE, mTitle);
values.put(MovieContract.MovieEntry.COLUMN_OVERVIEW, mOverview);
values.put(MovieContract.MovieEntry.COLUMN_DATE, mReleaseDate);
values.put(MovieContract.MovieEntry.COLUMN_VOTE, mRate);
values.put(MovieContract.MovieEntry.COLUMN_POSTER, mPoster);
mNewUri = getContentResolver().insert(MovieContract.MovieEntry.CONTENT_URI, values);
Log.v("New insertion", "Successful insertion in URI: " + mNewUri);
Toast.makeText(getApplicationContext(), mTitle + " added to your Favorites" , Toast.LENGTH_SHORT).show();
}
以下是内容提供商代码: 合同类:
public class MovieContract {
public static final String CONTENT_AUTHORITY =
"com.example.geekymind.movieapp.Data";
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
public static final class MovieEntry implements BaseColumns {
// table name
public static final String TABLE_FMovies = "favorites";
// columns
public static final String _ID = "_id";
public static final String COLUMN_POSTER = "poster_path";
public static final String COLUMN_OVERVIEW = "overview";
public static final String COLUMN_ID_MOVIE ="movie_ID";
public static final String COLUMN_TITLE ="title";
public static final String COLUMN_DATE ="date";
public static final String COLUMN_VOTE ="vote_average";
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
.appendPath(TABLE_FMovies).build();
public static final String CONTENT_DIR_TYPE =
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + TABLE_FMovies;
public static final String CONTENT_ITEM_TYPE =
ContentResolver.CURSOR_ITEM_BASE_TYPE +"/" + CONTENT_AUTHORITY + "/" + TABLE_FMovies;
public static Uri buildFlavorsUri(long id){
return ContentUris.withAppendedId(CONTENT_URI, id);
}
}
}
数据库助手类
public class MovieDBHelper extends SQLiteOpenHelper {
public static final String LOG_TAG = MovieDBHelper.class.getSimpleName();
//name & version
private static final String DATABASE_NAME = "favorites.db";
private static final int DATABASE_VERSION = 300;
public MovieDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Create the database
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " +
MovieContract.MovieEntry.TABLE_FMovies + "(" + MovieContract.MovieEntry._ID +
" INTEGER PRIMARY KEY AUTOINCREMENT, " +
MovieContract.MovieEntry.COLUMN_ID_MOVIE + " INTEGER PRIMARY KEY," +
MovieContract.MovieEntry.COLUMN_TITLE + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_OVERVIEW + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_DATE + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_VOTE + " TEXT NOT NULL, " +
MovieContract.MovieEntry.COLUMN_POSTER +" TEXT NOT NULL);";
sqLiteDatabase.execSQL(SQL_CREATE_MOVIE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
Log.w(LOG_TAG, "Upgrading database from version " + oldVersion + " to " +
newVersion + ". OLD DATA WILL BE DESTROYED");
// Drop the table
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + MovieContract.MovieEntry.TABLE_FMovies);
sqLiteDatabase.execSQL("DELETE FROM SQLITE_SEQUENCE WHERE NAME = '" +
MovieContract.MovieEntry.TABLE_FMovies + "'");
// re-create database
onCreate(sqLiteDatabase);
}
}
在内容提供程序类中插入方法
public Uri insert(Uri uri, ContentValues values){
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Uri returnUri;
switch (sUriMatcher.match(uri)) {
case MOVIE: {
long _id = db.insert(MovieContract.MovieEntry.TABLE_FMovies, null, values);
// insert unless it is already contained in the database
if (_id > 0) {
returnUri = MovieContract.MovieEntry.buildFlavorsUri(_id);
} else {
throw new android.database.SQLException("Failed to insert row into: " + uri);
}
break;
}
default: {
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
}
getContext().getContentResolver().notifyChange(uri, null);
return returnUri;
}
EDIT1: 我不知道这是否有助于找出问题,但任何方式都是我在插入之前从意图中获取数据的方式。
Intent intent = getIntent();
final String mTitle = intent.getStringExtra("MovieTitle");
final String mRate = Double.toString(intent.getDoubleExtra("voteAverage", 0.0));
final String mReleaseDate = intent.getStringExtra("ReleaseDate");
final String mOverview = intent.getStringExtra("MovieOverview");
final String mPoster = intent.getStringExtra("PosterPath");
movieId = intent.getIntExtra("MovieId", 157336);
EDIT2: 崩溃日志
01-05 02:25:18.567 17736-17736/com.example.geekymind.movieapp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x415ffc80)
答案 0 :(得分:0)
首先,我使用 try-catch 来了解错误,这对于像我这样的初学者来说可能只是额外的一步。但从这次经历来看,它必然要进行调试。 所以我发现我在这里有同样的问题(IllegalArgumentException: Unknown URL content:// CONTENT),解决方法是确保权限,并在清单文件中,使提供者标记成为应用程序标记的子代,而不是活动标记。