Android内容提供商不工作

Android内容提供商不工作,android,exception,insert,android-contentprovider,Android,Exception,Insert,Android Contentprovider,我正在试图弄清楚为什么这个内容提供商不工作。我觉得我拥有一切我应该拥有的,为了让它发挥作用。 由于某种原因,它一直在insert方法上崩溃。我认为这与内容提供商的标签有关。如果你有任何帮助,请解释我做错了什么。 我在底部还有logcat 我的意图是将一些数据插入到内容提供商中,但似乎无法找到它 这是我为内容提供商提供的类 package net.learn2develop.ContentProviders; import android.content.ContentProvider; imp

我正在试图弄清楚为什么这个内容提供商不工作。我觉得我拥有一切我应该拥有的,为了让它发挥作用。 由于某种原因,它一直在insert方法上崩溃。我认为这与内容提供商的标签有关。如果你有任何帮助,请解释我做错了什么。 我在底部还有logcat

我的意图是将一些数据插入到内容提供商中,但似乎无法找到它

这是我为内容提供商提供的类

package net.learn2develop.ContentProviders;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

public class CourseProvider extends ContentProvider
{
    /* define constants for the content provider */

    // authority
    static final String PROVIDER_NAME =
                           "seneca.ict.provider.Courses";

    // content URI: authority + data path
    // - access modifier: public!
    public static final Uri CONTENT_URI =
                         Uri.parse("content://"+ PROVIDER_NAME + "/courses");

    // column names for the content provider
    // - access modifiers: public!
    public static final String _ID = "_id";
    public static final String TITLE = "desc";
    public static final String ISBN = "code";

    static final int BOOKS = 1;
    static final int BOOK_ID = 2;

    // UriMatcher: utility class used for matching URIs
    private static final UriMatcher uriMatcher;
    static{
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(PROVIDER_NAME, "courses", BOOKS);
        uriMatcher.addURI(PROVIDER_NAME, "courses/#", BOOK_ID);
    }

    /* define constants for the database */
    //---for database use---
    SQLiteDatabase booksDB;

    static final String DATABASE_NAME = "ICTCOURSES";
    static final String DATABASE_TABLE = "COURSESINFO";
    static final int    DATABASE_VERSION = 1;

    static final String DATABASE_CREATE =
                        "create table " + DATABASE_TABLE +
                        " (_id integer primary key autoincrement, "
                        + "desc text not null, code text not null,room text not null);";

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,
                int newVersion) {
            Log.w("Content provider database",
                    "Upgrading database from version " +
                            oldVersion + " to " + newVersion +
                    ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS titles");
            onCreate(db);
        }
    } // end DatabaseHelper

    /* implemenation of the CRUD principle */
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // arg0 = uri 
        // arg1 = selection
        // arg2 = selectionArgs
        int count=0;
        switch (uriMatcher.match(arg0)){
        case BOOKS:
            count = booksDB.delete(
                    DATABASE_TABLE,
                    arg1,
                    arg2);
            break;
        case BOOK_ID:
            String id = arg0.getPathSegments().get(1);
            count = booksDB.delete(
                    DATABASE_TABLE,
                    _ID + " = " + id +
                    (!TextUtils.isEmpty(arg1) ? " AND (" +
                            arg1 + ')' : ""),
                            arg2);
            break;
        default: throw new IllegalArgumentException("Unknown URI " + arg0);
        }

        // notify listeners for data changes (caused by delete) in the content provider
        getContext().getContentResolver().notifyChange(arg0, null);

        return count;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){

        //---get all books---
        case BOOKS:
            return "vnd.android.cursor.dir/vnd.learn2develop.courses ";

        //---get a particular book---
        case BOOK_ID:
            return "vnd.android.cursor.item/vnd.learn2develop.courses ";

        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //---add a new book---

        long rowID = booksDB.insert(
                        DATABASE_TABLE,
                        "",
                        values);

        //---if added successfully---
        if (rowID>0)
        {
            Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);

            // notify listeners for data changes (caused by insert) in the content provider
            getContext().getContentResolver().notifyChange(_uri, null);

            return _uri;
        }
        throw new SQLException("Failed to insert row into " + uri);
    }

    @Override
    public boolean onCreate() {
        Context context = getContext();

        DatabaseHelper dbHelper = new DatabaseHelper(context);

        booksDB = dbHelper.getWritableDatabase();

        return (booksDB == null)? false:true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {

        SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();

        sqlBuilder.setTables(DATABASE_TABLE);

        if (uriMatcher.match(uri) == BOOK_ID)

            //---if getting a particular book---
            sqlBuilder.appendWhere(
                    _ID + " = " + uri.getPathSegments().get(1));

        if (sortOrder==null || sortOrder=="")
            sortOrder = TITLE;

        Cursor c = sqlBuilder.query(
                      booksDB,
                      projection,
                      selection,
                      selectionArgs,
                      null,
                      null,
                      sortOrder);

        //---register to watch a content URI for changes---
        // - the given URI will be notified when there'a a data change in the Cursor object
        c.setNotificationUri(getContext().getContentResolver(), uri);

        return c;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {

        int count = 0;

        switch (uriMatcher.match(uri)){

        case BOOKS:
             count = booksDB.update(
                        DATABASE_TABLE,
                        values,
                        selection,
                        selectionArgs );
            break;
        case BOOK_ID:
             count = booksDB.update(
                        DATABASE_TABLE,
                        values,
                        _ID + " = " + uri.getPathSegments().get(1) +
                        (!TextUtils.isEmpty(selection) ? " AND (" +
                             selection + ')' : ""), 
                        selectionArgs );
            break;
        default: throw new IllegalArgumentException("Unknown URI " + uri);
        }

        // notify listeners for data changes (caused by update) in the content provider
        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.learn2develop.ContentProviders"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" 
              android:targetSdkVersion="18"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".ContentProvidersActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider android:name="CourseProvider"
            android:authorities="net.learn2develop.provider.Courses"
            android:exported="true">            
        </provider>            
    </application>

</manifest>
这是我用来加载内容提供者的清单文件

package net.learn2develop.ContentProviders;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

public class CourseProvider extends ContentProvider
{
    /* define constants for the content provider */

    // authority
    static final String PROVIDER_NAME =
                           "seneca.ict.provider.Courses";

    // content URI: authority + data path
    // - access modifier: public!
    public static final Uri CONTENT_URI =
                         Uri.parse("content://"+ PROVIDER_NAME + "/courses");

    // column names for the content provider
    // - access modifiers: public!
    public static final String _ID = "_id";
    public static final String TITLE = "desc";
    public static final String ISBN = "code";

    static final int BOOKS = 1;
    static final int BOOK_ID = 2;

    // UriMatcher: utility class used for matching URIs
    private static final UriMatcher uriMatcher;
    static{
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(PROVIDER_NAME, "courses", BOOKS);
        uriMatcher.addURI(PROVIDER_NAME, "courses/#", BOOK_ID);
    }

    /* define constants for the database */
    //---for database use---
    SQLiteDatabase booksDB;

    static final String DATABASE_NAME = "ICTCOURSES";
    static final String DATABASE_TABLE = "COURSESINFO";
    static final int    DATABASE_VERSION = 1;

    static final String DATABASE_CREATE =
                        "create table " + DATABASE_TABLE +
                        " (_id integer primary key autoincrement, "
                        + "desc text not null, code text not null,room text not null);";

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {
            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,
                int newVersion) {
            Log.w("Content provider database",
                    "Upgrading database from version " +
                            oldVersion + " to " + newVersion +
                    ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS titles");
            onCreate(db);
        }
    } // end DatabaseHelper

    /* implemenation of the CRUD principle */
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // arg0 = uri 
        // arg1 = selection
        // arg2 = selectionArgs
        int count=0;
        switch (uriMatcher.match(arg0)){
        case BOOKS:
            count = booksDB.delete(
                    DATABASE_TABLE,
                    arg1,
                    arg2);
            break;
        case BOOK_ID:
            String id = arg0.getPathSegments().get(1);
            count = booksDB.delete(
                    DATABASE_TABLE,
                    _ID + " = " + id +
                    (!TextUtils.isEmpty(arg1) ? " AND (" +
                            arg1 + ')' : ""),
                            arg2);
            break;
        default: throw new IllegalArgumentException("Unknown URI " + arg0);
        }

        // notify listeners for data changes (caused by delete) in the content provider
        getContext().getContentResolver().notifyChange(arg0, null);

        return count;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){

        //---get all books---
        case BOOKS:
            return "vnd.android.cursor.dir/vnd.learn2develop.courses ";

        //---get a particular book---
        case BOOK_ID:
            return "vnd.android.cursor.item/vnd.learn2develop.courses ";

        default:
            throw new IllegalArgumentException("Unsupported URI: " + uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //---add a new book---

        long rowID = booksDB.insert(
                        DATABASE_TABLE,
                        "",
                        values);

        //---if added successfully---
        if (rowID>0)
        {
            Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);

            // notify listeners for data changes (caused by insert) in the content provider
            getContext().getContentResolver().notifyChange(_uri, null);

            return _uri;
        }
        throw new SQLException("Failed to insert row into " + uri);
    }

    @Override
    public boolean onCreate() {
        Context context = getContext();

        DatabaseHelper dbHelper = new DatabaseHelper(context);

        booksDB = dbHelper.getWritableDatabase();

        return (booksDB == null)? false:true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {

        SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();

        sqlBuilder.setTables(DATABASE_TABLE);

        if (uriMatcher.match(uri) == BOOK_ID)

            //---if getting a particular book---
            sqlBuilder.appendWhere(
                    _ID + " = " + uri.getPathSegments().get(1));

        if (sortOrder==null || sortOrder=="")
            sortOrder = TITLE;

        Cursor c = sqlBuilder.query(
                      booksDB,
                      projection,
                      selection,
                      selectionArgs,
                      null,
                      null,
                      sortOrder);

        //---register to watch a content URI for changes---
        // - the given URI will be notified when there'a a data change in the Cursor object
        c.setNotificationUri(getContext().getContentResolver(), uri);

        return c;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {

        int count = 0;

        switch (uriMatcher.match(uri)){

        case BOOKS:
             count = booksDB.update(
                        DATABASE_TABLE,
                        values,
                        selection,
                        selectionArgs );
            break;
        case BOOK_ID:
             count = booksDB.update(
                        DATABASE_TABLE,
                        values,
                        _ID + " = " + uri.getPathSegments().get(1) +
                        (!TextUtils.isEmpty(selection) ? " AND (" +
                             selection + ')' : ""), 
                        selectionArgs );
            break;
        default: throw new IllegalArgumentException("Unknown URI " + uri);
        }

        // notify listeners for data changes (caused by update) in the content provider
        getContext().getContentResolver().notifyChange(uri, null);

        return count;
    }
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.learn2develop.ContentProviders"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="14" 
              android:targetSdkVersion="18"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".ContentProvidersActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <provider android:name="CourseProvider"
            android:authorities="net.learn2develop.provider.Courses"
            android:exported="true">            
        </provider>            
    </application>

</manifest>

您创建了一个URI来访问
课程表
,但是给了错误的名称课程

因为您给定的表名是

static final String DATABASE_TABLE = "COURSESINFO";
因此,请将您的
数据库\u表
名称,即课程信息更改为
课程


希望这能对您有所帮助。

我尝试过,但似乎无法解决coursesinfo中的相同错误。该名称是否必须与数据库的名称匹配?@Lpc_dark您是否也在这两行中更改了“cources”,并尝试了uriMatcher.addURI(PROVIDER_name,“courses”,BOOKS);addURI(提供者名称,“课程/”,图书ID);我在android清单中找到了它,提供商名称需要更改
static final String DATABASE_TABLE = "COURSESINFO";
public static final Uri CONTENT_URI =
                         Uri.parse("content://"+ PROVIDER_NAME + "/COURSESINFO");