Déclarant Fournisseur De Contenu
C'est ma première fois à l'aide d'un fournisseur de contenu, mais j'ai suivi le développeur docs mais quand je lance le programme il me dit failed to find provider info
voici mon manifeste
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tyczj.bowling"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="11" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity android:name="Tabs">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="BowlersList"></activity>
</application>
<provider android:name="com.tyczj.bowling.BowlersDB"
android:authorities="com.tyczj.bowling.bowlersdb">
</provider>
</manifest>
et mon fournisseur de contenu
public class BowlersDB extends ContentProvider {
private static final String DATABASE_NAME = "Bowlers";
private static final String BOWLERS_TABLE = "bowlers_table";
private static final int DATABASE_VERSION = 1;
public static final Uri CONTENT_URI = Uri.parse("content://com.tyczj.bowling.bowlersdb");
private static final UriMatcher uriMatcher;
static final String NAME = "name";
static final String ID = "_id";
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public Cursor getBowlers(){
return db.query(BOWLERS_TABLE, new String[] {ID,NAME},null,null,null,null,NAME + " ASC");
}
public Cursor getId(String name){
Cursor c = db.query(BOWLERS_TABLE, new String[] {ID,NAME},NAME + "='" + name +"'",null,null,null,null);
if(c != null && c.moveToFirst()){
do{
if(c.getString(c.getColumnIndex(NAME)).equals(name)){
return c;
}
}while(c.moveToNext());
}
return c;
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
createTables(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion)
{
Log.w("CalendarDB", "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS Events_Table");
onCreate(db);
}
private void createTables(SQLiteDatabase db){
db.execSQL("CREATE TABLE " + BOWLERS_TABLE + "(" + ID + " integer primary key autoincrement, " +
NAME + " TEXT);");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
int num = uriMatcher.match(uri);
if(num == 1){
count = db.delete(BOWLERS_TABLE, selection,selectionArgs);
}else if(num == 2){
String id = uri.getPathSegments().get(1);
count = db.delete(BOWLERS_TABLE, ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" +
selection + ')' : ""),
selectionArgs);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
if(uriMatcher.match(uri) == 1){
return "vnd.android.cursor.dir/vnd.tyczj.bowlersdb ";
}else if(uriMatcher.match(uri) == 2){
return "vdn.android.cursor.item/vnd.tyczj.bowlersdb ";
}else
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowID = db.insert(BOWLERS_TABLE,null, values);
if(rowID > 0){
Uri _uri = ContentUris.withAppendedId(CONTENT_URI,rowID);
getContext().getContentResolver().notifyChange(_uri,null);
return _uri;
}else{
throw new SQLException("Failed to insert row into " + uri);
}
}
@Override
public boolean onCreate() {
Context context = getContext();
DBHelper = new DatabaseHelper(context);
db = DBHelper.getWritableDatabase();
return (db == null)? false:true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
sqlBuilder.setTables(BOWLERS_TABLE);
if(uriMatcher.match(uri) == 1){
sqlBuilder.appendWhere(ID + " = " + uri.getPathSegments().get(1));
}
if(sortOrder == null || sortOrder == "")
sortOrder = NAME;
Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs,null,null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int count = 0;
int num = uriMatcher.match(uri);
if(num == 1){
count = db.update(BOWLERS_TABLE, values, selection, selectionArgs);
}else if(num == 2){
count = db.update(BOWLERS_TABLE, values, ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" +
selection + ')' : ""),
selectionArgs);
}else{
throw new IllegalArgumentException(
"Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.tyczj.bowling.bowlersdb","bowlers",1);
uriMatcher.addURI("com.tyczj.bowling.bowlersdb","bowlers/#",2);
}
}
pas sûr de ce que j'ai fait de mal?
OriginalL'auteur tyczj | 2011-11-28
Vous devez vous connecter pour publier un commentaire.
Prestataire doit être dans la balise application.
column "_id" does not exist
?Besoin de code et stacktrace pour être en mesure de répondre à ça.
Si vous placez le fournisseur de balise à l'extérieur de la balise application, il échoue dans les Kit Kat, mais fonctionne partout ailleurs...à l'intérieur de la balise application se bloque dans KK.
OriginalL'auteur azharb
Vous ne devez pas appeler
db = DBHelper.getWritableDatabase();
dans le ContentProvider onCreate. C'est pour la raison donnée dansSQLiteOpenHelper
documentation pourgetReadableDatabase
etgetWritableDatabase
:Au lieu de tenir une référence à la SQLiteOpenHelper instance et d'appel getWritableDatabase/getReadableDatabase en fonction de la requête/insérer/supprimer/mettre à jour les méthodes qui sont appelées de manière asynchrone si vous utilisez des Chargeurs.
Désolé, ce n'est pas directement ciblées sur la question, mais c'est quelque chose que j'ai vu partout dans les exemples de code.
OriginalL'auteur Protonflux
vous avez reçu ce message, car vous définir votre Fournisseur en dehors de la balise Application.
merci donc de définir votre fournisseur à l'intérieur de l'application.
OriginalL'auteur vikseln
C'est un bon exemple de pourquoi pour utilisation de l'Android l'éditeur de Manifeste dans Eclipse. Il met ces éléments/composants dans leur point de vue syntaxique de l'emplacement exact, donc on n'a pas besoin de s'inquiéter à propos de cette question.
Une autre façon de voir les choses: pensez à utiliser l'éditeur de Manifeste au début (& de temps en temps tout au long) juste pour confirmer la justesse de votre manifeste.
OriginalL'auteur JDOaktown