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