Я пытаюсь вставить строку в таблицу под названием категории с помощью контент-провайдеров.Я посмотрел руководство по Android Developer и скопировал процедуру.Тем не менее, URI возвращает ноль, и строка не вставляется.Я зарегистрировал провайдера в манифесте.Я думаю, что проблема с содержанием Uri.Имя пакета для моей папки называется app.android.com.todo, а поставщик содержимого - TodosProvider.Поставщик контента находится в пакете, называемом data, который находится внутри app.android.com.todo.Название таблицы - категории.В результате я подумал, что URI - это содержимое: //app.android.com.todo.todosprovider/categories.
Я попытался удалить app.android из списка прав и попытался изменить todosprovider на TodosProvider.Я попытался изменить полномочия на app.android.com.todo.data.todosprovider (я добавил данные в полномочия), потому что поставщик находится в папке с именем data.Uri по-прежнему нулевой.
Это класс, в который помещаются все строки и константы
package app.android.com.todo.data;
import android.net.Uri;
import android.provider.BaseColumns;
public final class TodoContract {
//URI
public static final String CONTENT_AUTHORITY="app.android.com.todo.todosprovider";
public static final String PATH_CATEGORIES= "categories";
public static final Uri BASE_CONTENT_URI= Uri.parse("content://"+ CONTENT_AUTHORITY);
public static final class CategoriesEntry implements BaseColumns {
public static final Uri CONTENT_URI= Uri.withAppendedPath(BASE_CONTENT_URI,PATH_CATEGORIES);
// Table name
public static final String TABLE_NAME = "categories";
//column names
public static final String _ID = BaseColumns._ID;
public static final String COLUMN_DESCRIPTION = "description";
}
}. Здесь я пытаюсь вставить строку
private void CreateCategory(){
ContentValues values = new ContentValues(1);
values.put(TodoContract.CategoriesEntry.
COLUMN_DESCRIPTION, "meme");
Uri uri= getContentResolver().insert
(TodoContract.CategoriesEntry.CONTENT_URI, values);
System.out.println( TodoContract.CategoriesEntry.CONTENT_URI+
" values "+ values + " inserted category "+ uri);
}
Это пакет вспомогательного класса базы данных app.android.com.todo.data;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import app.android.com.todo.data.TodoContract.CategoriesEntry;
import app.android.com.todo.data.TodoContract.TodosEntry;
public class DatabaseHelper extends SQLiteOpenHelper{
private static final String DATABASE_NAME = "todosapp.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_CATEGORIES_CREATE=
"CREATE TABLE " + CategoriesEntry.TABLE_NAME + " (" +
CategoriesEntry._ID + " INTEGER PRIMARY KEY, " +
CategoriesEntry.COLUMN_DESCRIPTION + " TEXT " +
")";
public DatabaseHelper(Context context ) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CATEGORIES_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + CategoriesEntry.TABLE_NAME);
onCreate(db);
}
} Это класс поставщика.Методы курсора, вставки, удаления, обновления, getType и запроса равны нулю.
public class TodosProvider extends ContentProvider {
//constants for the operation, the amount does not matter, must be unique
private static final int TODOS=1;
private static final int TODOS_ID=2;
private static final int CATEGORIES=3;
private static final int CATEGORIES_ID=4;
private static final UriMatcher uriMatcher=
new UriMatcher(UriMatcher.NO_MATCH);
static{
uriMatcher.addURI(CONTENT_AUTHORITY,
PATH_CATEGORIES,CATEGORIES);
uriMatcher.addURI(CONTENT_AUTHORITY,
PATH_CATEGORIES + "/#", CATEGORIES_ID);
}
private DatabaseHelper helper;
@Override
public boolean onCreate() {
helper= new DatabaseHelper(getContext());
return false;
}
}
Я печатаю content_uri, values и uri в систему, когда пытаюсь создать категорию.Content_uri и значения не равны NULL, но URI равен.