Une étude préliminaire sur ContentProvider
Introduction à cette section :
Ce que cette section vous apporte est le dernier des quatre composants majeurs d'Android - ContentProvider (fournisseur de contenu), qui peut être pour certains lecteurs J'ai une question : « Android n'a-t-il pas cinq composants principaux ? Et qu'en est-il de l'intention ? » Oui, l'intention est également très importante, mais elle Maintenez simplement la connexion entre ces composants ! Nous expliquerons l’intention dans le prochain chapitre ! En parlant de ce ContentProvider, quand allons-nous Sera-t-il utilisé ? Il existe les deux types suivants :
- 1.Nous souhaitons accéder à d'autres applications dans notre propre application, ou à certaines données qui nous sont exposées par un ContentProvider, Tels que les contacts du téléphone portable, les messages texte, etc. ! Nous souhaitons lire ou modifier ces données, nous devons donc utiliser ContentProvider !
- 2.Notre propre application souhaite exposer certaines de ses données pour que d'autres applications puissent les lire ou les utiliser. Grâce à ContentProvider, nous pouvons également choisir les données à exposer, évitant ainsi la fuite de nos données privées !
Cela ressemble à une triche, mais c'est en fait très simple à utiliser. Découvrons ContentProvider~Documents officiels : ContentProviderDans cette section, nous le ferons. Expliquez le concept de ContentProvder et écrivez quelques exemples couramment utilisés d'utilisation du système ContentProvider. Et un ContentProvider personnalisé !
Explication du concept ContentProvider :
2. Utilisez le ContentProvider fourni par le système
En fait, souvent, lorsque nous utilisons ContentProvider, nous n'exposons pas nos propres données. Le plus souvent, nous utilisons ContentResolver pour lire d'autres informations d'application. La plus couramment utilisée est de lire le système. Informations sur l'application. Informations multimédia et bien plus encore ! Si vous souhaitez appeler ces ContentProviders, vous devez vérifier vous-même les informations API pertinentes ! De plus, différentes versions peuvent correspondre à différentes URL ! Voici comment récupérer l'URL et les champs de la table de base de données correspondante, Ici, nous prenons comme exemple les contacts les plus couramment utilisés. Pour les autres, google~
①Allez dans le fichier de code source du système : all-src.rar -> TeleponeProvider -> AndroidManifest.xml pour trouver l'API correspondante<🎜. >②Ouvrez le fichier de l'émulateur explorer/data/data/com.android.providers.contacts/databases/contact2.db Après l'exportation, utilisez l'outil graphique SQLite pour afficher les trois tables principales :
table raw_contact , table de données , table de types MIME ! Ce qui suit montre quelques exemples d'opérations de base :
1) Lecture simple des informations de la boîte de réception :
Code principal :
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
//获取的是哪些列的信息
Cursor cursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
while( slider.moveToNext())
{
String address = cursor.getString(0);
String date = cursor.getString(1);
String type = cursor.getString(2);
String body = cursor.getString(3);
System.out.println("地址:" + address);
System.out.println("时间:" + date);
System .out.println("类型:" + type);
System.out.println("内容:" + body);
System.out.println("========== ============");
}
cursor.close();
}
别忘了,avec AndroidManifest.xml加入读取收件箱的权限:
Résultats en cours d'exécution :
Une partie des résultats en cours d'exécution est la suivante :
2) Ajoutez-le simplement dans votre boîte de réception Insérez un message
Code principal :
ContentResolver solver = getContentResolver();
Uri uri = Uri .parse("content://sms/");
ContentValues conValues = new ContentValues();
conValues.put("adresse", "123456789");
conValues.put("type" , 1);
conValues.put("date", System.currentTimeMillis());
conValues.put("body", "no zuo no die pourquoi tu essaies !" );
résolveur. insert(uri, conValues);
Log.e("HeHe", "insertion SMS terminée~");
}
Résultats d'exécution :
Remarques :
Le code ci-dessus La fonction d'écriture de messages texte peut être implémentée sous la version 4.4, mais elle ne peut pas être écrite sur la version 5.0. Les raisons sont : À partir de la version 5.0, les logiciels autres que l'application SMS par défaut ne peuvent pas envoyer de messages texte en écrivant dans la base de données SMS !
3) Lecture simple des contacts du téléphone portable
Code principal :
//①Interrogez la table raw_contacts pour obtenir l'identifiant du contact
ContentResolver solver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//Requête des données de contact
cur sor = solver .query(uri, null, null, null, null);
while(cursor.moveToNext())
{
//Obtenir le nom du contact, le numéro de téléphone portable
String cName = curseur. getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String cNum = curseur.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out .println(" Nom :" + cName);
System.out.println("Number:" + cNum);
System.out.println("================= ======");
}
curseur.close();
}
N'oubliez pas d'ajouter l'autorisation de lire le contact :
Résultats en cours d'exécution :
Une partie des résultats en cours d'exécution est la suivante :
4) Interroger le contact informations du numéro de téléphone spécifié
Code principal :
Uri uri = Uri.parse("content ://com.android .contacts/data/phones/filter/" + numéro);
ContentResolver solver = getContentResolver();
Curseur curseur = solver.query(uri, new String[]{"display_name" }, null, null, null);
if (cursor.moveToFirst()) {
String name = curseur.getString(0);
System.out.println(number + "Nom du contact correspondant : " + nom) ;
}
curseur.close();
}
Résultat de l'exécution :
5) Ajouter un nouveau contact
Code de base :
//使用事务添加联系人
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts") ;
Uri dataUri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = getContentResolver();
ArrayList<ContentProviderOperation> Operations = new ArrayList<ContentProviderOperation>();
ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
.withValue("account_name", null)
.build();
opérations.add(op1 );
//依次是姓名,号码,邮编
ContentProviderOperation op2 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype" , "vnd.android.cursor.item/name")
.withValue("data2", "Coder-pig")
.build();
opérations.add(op2);
ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/phone _v2")
. withValue("data1", "13798988888")
.withValue("data2", "2")
.build();
opérations.add(op3);
ContentProviderOperation op4 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/email_v2")
.withValue("data1", "779878443@qq.com")
.withValue("data2", "2" )
.build();
operations.add(op4);
//Ajouter le contenu ci-dessus aux contacts du téléphone mobile~
solver.applyBatch("com.android.contacts", opérations ; 🎜>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_PROFILE"/>3. ContentProvider personnalisé
Nous définissons rarement ContentProvider nous-mêmes car nous ne voulons souvent pas que les données de nos applications soient exposées. Pour les autres applications, malgré cela, il est encore nécessaire d'apprendre à utiliser ContentProvider. Il existe un autre moyen de transmission de données, n'est-ce pas~
Voici un organigramme que j'ai dessiné auparavant :
Ensuite, nous allons l'implémenter étape par étape :
Avant de commencer, nous devons d'abord créer une classe de création de base de données (le contenu de la base de données sera discuté plus tard~) :
DBOpenHelper .java
final String CREATE_SQL = "CREATE TABLE test(_id INTEGER PRIMARY KEY AUTOINCREMENT,name) ";
public DBOpenHelper(Contexte de contexte, nom de chaîne, fabrique CursorFactory,
version int) {
super(contexte, nom, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
TODO Stub de méthode généré automatiquement
Étape 1 : Personnalisez la classe ContentProvider, implémentez onCreate(), getType() et réécrivez les méthodes d'ajout, de suppression, de modification et de recherche correspondantes en fonction des besoins :
NameContentProvider.java
//Initialiser certaines constantes
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
private DBOpenHelper dbOpenHelper;
//Afin de faciliter l'utilisation directe d'UriMatcher, ajoutez URI ici, puis appelez Matcher pour faire correspondre
static{
matcher.addURI("com.jay.example.providers.myprovider", "test", 1 ); 🎜> return true;
}
@Override
requête de curseur public (Uri uri, projection String[], sélection de chaîne,
String[] sélectionArgs, String sortOr der) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
insert Uri public (Uri uri, valeurs ContentValues) {
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
long rowId = db.insert("test", null, valeurs );
if(rowId > 0)
{
//Ajouter l'ID à l'Uri existant
Uri nameUri = ContentUris.withAppendedId(uri, rowId);
//Les données de notification ont changé
getContext().getContentRe solver().notifyChange(nameUri , null) ;
return nameUri;
}
}
return null;
}
@Override
public int delete(Uri uri, String selection, String [] selectionArgs ) {
return 0;
}
@Override
public int update (Uri uri, valeurs ContentValues, sélection de chaîne,
sélection String[] Args) {
return 0;
}
}
Étape 2 : Enregistrez ContentProvider dans AndroidManifest.xml :
<provider android:name="com.jay.example.bean.NameContentProvider"
android:authorities="com.jay.example.providers.myprovider"
android:authorities="com.jay.example.providers.myprovider"
D'accord, la partie en tant que ContentProvider est terminée !
Ensuite, créons un nouveau projet et implémentons la partie ContentResolver. Nous insérons une donnée directement en cliquant sur le bouton :
MainActivity.java<. 🎜>
bouton privé btninsert;
@Override
protected void onCreate(Bundle savingInstanceState) {
super.onCreate( saveInstanceState);
setContentView(R.layout.activity_main);
btninsert = (Button) findViewById(R.id.btninsert);
//Lire les données du fournisseur de contenu
final ContentResolver solver = this.getContentResolver();
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
values.put("name" , "Test");
Uri uri = Uri.parse("content://com.jay.example.providers.myprovider/test ");
solver.insert(uri, valeurs);
Toast.makeText(getApplicationContext(), "Insertion des données réussie", Toast.LENGTH_SHORT).show();
}
});
Comment utiliser ? Eh bien, le code est assez simple. Exécutez d'abord le projet en tant que ContentProvider, puis exécutez le projet en tant que ContentResolver. Cliquez sur le bouton pour insérer une donnée, puis ouvrez l'explorateur de fichiers pour extraire la base de données de ContentProvider et utilisez l'outil de visualisation graphique. Vous pouvez trouver les données insérées et la relation temporelle en les visualisant. Les résultats ne seront pas démontrés ~
4. Surveillez les modifications des données de ContentProvider via ContentObserver
<🎜. >
Guide d'utilisation :
Après avoir exécuté le programme, laissez-le tranquille. Après avoir reçu le message texte, vous pouvez voir le contenu du message sur logcat, et vous. peut le personnaliser selon vos besoins. Changez Activtiy en Service et faites ce genre de chose en arrière-plan~
Résumé de cette section :
D'accord, c'est tout pour l'exploration préliminaire de ContentProvider . Dans cette section, nous avons appris : Le concept et le processus de ContentProvider, en utilisant certains ContentProvider fournis par le système et en personnalisant votre propre ContentProvider, Enfin, j'ai également expliqué comment surveiller les modifications des données de ContentProvider via ContentObserver, et le contenu de ContentProvider est presque maîtrisé. D'accord, parcourons la documentation dans la section suivante pour voir s'il y a quelque chose que nous ne savons pas ~ Merci