Content Provider Android (Content Provider)
provedor de conteúdo, solicitando componente fornece dados de uma aplicação para outra aplicação. Estes pedidos pelo caminho classe ContentResolver de lidar. Os provedores de conteúdo podem utilizar formas diferentes para armazenar dados. Os dados podem ser armazenados numa base de dados, ficheiros, ou mesmo uma rede.
Às vezes, a necessidade de compartilhar dados entre aplicações. Neste caso, o fornecedor de conteúdo torna-se muito útil.
Os provedores de conteúdo podem fazer foco do conteúdo, você pode ter um número de diferentes aplicações de acesso, se necessário. Os provedores de conteúdo e funciona como um banco de dados. Você pode consultar, editar seu conteúdo, use insert (), update (), delete () e consulta () para adicionar ou excluir conteúdo. Na maioria dos casos, os dados são armazenados numa base de dados SQLite.
O provedor de conteúdo é implementado como uma subclasse da classe classe ContentProvider. É necessário implementar uma série de API padrão, para que outros aplicativos para executar a transação.
public class MyApplication extends ContentProvider { }
conteúdo URI
Para consultar o provedor de conteúdo, você precisa ser na forma de o seguinte formato para especificar a cadeia de consulta URI:
<prefix>://<authority>/<data_type>/<id>
O que se segue é uma descrição específica de cada parte da URI:
seção | explicação |
---|---|
prefixo | Prefixo: foi definido como conteúdo: // |
autoridade | Autorização: Especifica o nome do provedor de conteúdo, como contatos, navegador, etc. provedores de conteúdo de terceiros pode ser um nome completo, tais como: cn.programmer.statusprovider |
data_type | Tipo de dados: Isso indica que esse tipo específico de provedor de conteúdo dos dados. Por exemplo: Você quer fornecer pelo provedor de conteúdo para obter todo o catálogo de endereços de contatos, o caminho de dados é o povo, então o URI ficará da seguinte forma: conteúdo: // contatos / pessoas |
identidade | Este pedido especificado um determinado registro. Por exemplo: Você fornece o provedor de conteúdo Contacto Encontre o número de contacto ID é 5, então o URI se parece com isso: conteúdo: // contatos / pessoas / 5 |
Criar provedor de conteúdo
passos simples descritos aqui fornecedores para criar seu próprio conteúdo.
- Primeiro, você precisa criar uma classe derivada ContentProviderbase classe de provedor de conteúdo.
- Em segundo lugar, você precisa definir o seu conteúdo para acessar provedor de conteúdo de endereço URI.
- Em seguida, você precisa criar um banco de dados para armazenar conteúdo. Normalmente, Android usa banco de dados SQLite e substituir onCreate () método utilizado no quadro do método SQLiteOpenHelper para criar ou abrir um provedor de banco de dados. Quando o aplicativo é iniciado, o seu método de cada provedor de conteúdo onCreate () será chamado no thread principal do aplicativo.
- Finalmente, use a tag <provedor ... /> registrado em AndroidManifest.xml provedor de conteúdo.
O seguinte é o provedor de conteúdo para obter o seu trabalho, você precisa de algum método na reescrita classe ContentProvider:
- onCreate (): Chamado quando o provedor é iniciado.
- query (): Este método aceita solicitações do cliente. O resultado é o objeto ponteiro de retorno (Cursor).
- insert (): Os prestadores este conteúdo método para inserir um novo registro.
- delete (): Este método é excluído do provedor de conteúdo no registro existente.
- update (): Este método atualiza o provedor de conteúdo no registro existente.
- getType (): Este método retorna a determinado tipo de metadados URI.
Exemplos
Este exemplo explica como criar seu próprio provedor de conteúdo. Vamos seguir os passos abaixo:
passo | descrição |
---|---|
1 | Criar aplicativos do Android que usam Android Estúdio nomeado Provedor de Conteúdo, na cn.uprogrammer.contentprovider pacote, e o estabelecimento de atividades espaciais. |
2 | Modificar as principais atividades MainActivity.java arquivo para adicionar dois novos métodos onClickAddName () e onClickRetrieveStudents (). |
3 | Criado no âmbito do novo pacote Java cn.uprogrammer.contentprovider arquivo StudentsProvider.java para definir o provedor atual e métodos associados. |
4 | Use <provedor ... /> tag em AndroidManifest.xml registrado provedor de conteúdo. |
5 | Modificar o arquivo / activity_main.xml res de conteúdo padrão layout / para adicionar o registro do aluno contém uma interface simples. |
6 | Sem modificar strings.xml, Estúdio Android pagará arquivo strings.xml atenção. |
7 | Lançar emulador Android para executar o aplicativo e verificar os resultados das alterações feitas no aplicativo. |
Aqui está o conteúdo do arquivo principal atividade src / cn.uprogrammer.contentprovider / MainActivity.java modificada. Este ficheiro contém cada um a abordagem básica de ciclo de vida. Nós adicionamos dois novos métodos, onClickAddName () e onClickRetrieveStudents () para permitir que a interação com o usuário pega aplicação.
package cn.uprogrammer.contentprovider; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.content.ContentValues; import android.content.CursorLoader; import android.database.Cursor; import android.view.Menu; import android.view.View; import android.widget.EditText; import android.widget.Toast; import cn.uprogrammer.contentprovider.R; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } public void onClickAddName(View view) { // Add a new student record ContentValues values = new ContentValues(); values.put(StudentsProvider.NAME, ((EditText)findViewById(R.id.editText2)).getText().toString()); values.put(StudentsProvider.GRADE, ((EditText)findViewById(R.id.editText3)).getText().toString()); Uri uri = getContentResolver().insert( StudentsProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show(); } public void onClickRetrieveStudents(View view) { // Retrieve student records String URL = "content://com.example.provider.College/students"; Uri students = Uri.parse(URL); Cursor c = managedQuery(students, null, null, null, "name"); if (c.moveToFirst()) { do{ Toast.makeText(this, c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)), Toast.LENGTH_SHORT).show(); } while (c.moveToNext()); } } }
Crie um novo arquivo no pacote StudentsProvider.java cn.uprogrammer.contentprovider. O seguinte é o conteúdo do src / cn.uprogrammer.contentprovider / StudentsProvider.java de.
package cn.uprogrammer.contentprovider; import java.util.HashMap; 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; public class StudentsProvider extends ContentProvider { static final String PROVIDER_NAME = "com.example.provider.College"; static final String URL = "content://" + PROVIDER_NAME + "/students"; static final Uri CONTENT_URI = Uri.parse(URL); static final String _ID = "_id"; static final String NAME = "name"; static final String GRADE = "grade"; private static HashMap<String, String> STUDENTS_PROJECTION_MAP; static final int STUDENTS = 1; static final int STUDENT_ID = 2; static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS); uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID); } /** * 数据库特定常量声明 */ private SQLiteDatabase db; static final String DATABASE_NAME = "College"; static final String STUDENTS_TABLE_NAME = "students"; static final int DATABASE_VERSION = 1; static final String CREATE_DB_TABLE = " CREATE TABLE " + STUDENTS_TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL, " + " grade 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(CREATE_DB_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME); onCreate(db); } } @Override public boolean onCreate() { Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); /** * 如果不存在,则创建一个可写的数据库。 */ db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { /** * 添加新学生记录 */ long rowID = db.insert( STUDENTS_TABLE_NAME, "", values); /** * 如果记录添加成功 */ if (rowID > 0) { Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to add a record into " + uri); } @Override public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(STUDENTS_TABLE_NAME); switch (uriMatcher.match(uri)) { case STUDENTS: qb.setProjectionMap(STUDENTS_PROJECTION_MAP); break; case STUDENT_ID: qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } if (sortOrder == null || sortOrder == ""){ /** * 默认按照学生姓名排序 */ sortOrder = NAME; } Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder); /** * 注册内容URI变化的监听器 */ c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs); break; case STUDENT_ID: String id = uri.getPathSegments().get(1); count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.update(STUDENTS_TABLE_NAME, values, selection, selectionArgs); break; case STUDENT_ID: count = db.update(STUDENTS_TABLE_NAME, values, _ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri ); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ /** * 获取所有学生记录 */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * 获取一个特定的学生 */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } }
A seguir, as modificações de arquivo AndroidManifest.xml. Aqui Adicionado <provedor ... /> tag para incluir os nossos provedores de conteúdo:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.uprogrammer.contentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.uprogrammer.contentprovider.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="StudentsProvider" android:authorities="com.example.provider.College" > </provider> </application> </manifest>
Aqui está o conteúdo de res / layout arquivo / activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="内容提供者实例" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="www.uprogrammer.cn" android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/ic_launcher" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="添加" android:layout_below="@+id/editText3" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_alignLeft="@+id/textView2" android:layout_alignStart="@+id/textView2" android:onClick="onClickAddName"/> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_alignTop="@+id/editText" android:layout_alignLeft="@+id/textView1" android:layout_alignStart="@+id/textView1" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:hint="姓名" android:textColorHint="@android:color/holo_blue_light" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText3" android:layout_below="@+id/editText" android:layout_alignLeft="@+id/editText2" android:layout_alignStart="@+id/editText2" android:layout_alignRight="@+id/editText2" android:layout_alignEnd="@+id/editText2" android:hint="年级" android:textColorHint="@android:color/holo_blue_bright" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" android:id="@+id/button" android:layout_below="@+id/button2" android:layout_alignRight="@+id/editText3" android:layout_alignEnd="@+id/editText3" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:onClick="onClickRetrieveStudents"/> </RelativeLayout>
Certifique-res / valores / arquivo strings.xml tem o seguinte conteúdo:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Content Provider</string> <string name="action_settings">Settings</string> </resources>
Vamos apenas executar um aplicativo provedor de conteúdo modificado. Presumo que você criou AVD durante o ambiente de instalação. Abra o projeto no arquivo ativo, clique na barra de ferramentas Ícone para executar o aplicativo no Android Studio. Estúdio Android instalar o aplicativo no AVD e inicia-lo. Se tudo correr bem, ele será exibido na janela do emulador da seguinte forma:
Digite o nome e ano, e clique no botão "Adicionar", que irá adicionar um registro de estudante nos dados, e na parte inferior para excluir uma mensagem. conteúdo de informação exibe um número de registros adicionados ao provedor de conteúdo banco de dados URI. Esta operação utiliza o método de inserção (). Repita esse processo para adicionar mais estudantes na base de dados do nosso provedor de conteúdo.
Depois de concluir o registro de banco de dados é adicionado, é hora de dar a volta ao provedor de conteúdo requer esses registros. Clique no botão "Pesquisar", que virá para recuperar e exibir todos os dados gravados através da aplicação do método query ().
Você pode fornecer método de retorno MainActivity.java para preparar atualizar e excluir operações e modificar a interface do usuário para adicionar atualizar e excluir operações.
Você pode usar o conteúdo existente fornecido desta forma por tais contatos. Você pode também desta forma para desenvolver uma boa aplicação orientado para o banco de dados, você pode ser realizada como descrito acima é conhecido como uma instância de operações de banco de dados, tais como leitura, escrita, atualizar e excluir.