如何使用内容提供程序和复选框按钮插入行?

时间:2016-01-05 00:21:01

标签: android checkbox android-contentprovider

当我检查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)

1 个答案:

答案 0 :(得分:0)

首先,我使用 try-catch 来了解错误,这对于像我这样的初学者来说可能只是额外的一步。但从这次经历来看,它必然要进行调试。 所以我发现我在这里有同样的问题(IllegalArgumentException: Unknown URL content:// CONTENT),解决方法是确保权限,并在清单文件中,使提供者标记成为应用程序标记的子代,而不是活动标记。