一.知识概括
二.案例
两个demo
一个专门用来提供数据 ContentProvider内容提供者(存在:数据库)
另一个demo专门用来访问数据 ContentResolver内容访问者
把Android25_ContentProvider里面的数据提供出去
具体代码实现如下
android25_contentprovider项目
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zking.android25_contentprovider.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名:"
android:id="@+id/et_main_uname"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码:"
android:id="@+id/et_main_upass"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="操作"
android:onClick="operation"
/>
</LinearLayout>
MainActivity.java
package com.zking.android25_contentprovider;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import com.zking.db.DBHelper;
public class MainActivity extends AppCompatActivity {
private EditText et_main_uname;
private EditText et_main_upass;
private SQLiteDatabase sqLiteDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取用户名及密码
et_main_uname = (EditText) findViewById(R.id.et_main_uname);
et_main_upass = (EditText) findViewById(R.id.et_main_upass);
//拿到DBHelper这个类
DBHelper dbHelper=new DBHelper(this,"databaseName.db",null,1);
sqLiteDatabase = dbHelper.getWritableDatabase();
}
//点击事件
public void operation(View view){//保存
//一点就拿到用户名和密码
String uname=et_main_uname.getText().toString();
String upass=et_main_upass.getText().toString();
//添加100条测试数据
for (int i = 0; i <100 ; i++) {
sqLiteDatabase.execSQL("insert into login(uname,upass) values('第"+i+"个人','123')");
}
//分页
int pageNo=2;//拿第几页
int pageSize=3;//每页拿几条
// Cursor cursor=sqLiteDatabase.rawQuery("select * from login limit ?,?",new String[]{((pageNo-1)*pageSize)+"",pageSize+""});
// while (cursor.moveToNext()){
// int uid=cursor.getInt(cursor.getColumnIndex("uid"));
// String name=cursor.getString(cursor.getColumnIndex("uname"));
// String pass=cursor.getString(cursor.getColumnIndex("upass"));
// Log.i("test",uid+" "+name+" "+pass);
// }
// Toast.makeText(this, "查看成功", Toast.LENGTH_SHORT).show();
}
}
DBHelper.java
package com.zking.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by Administrator on 2017/6/25 0025.
* 数据库(不需要指定数据类型,没有用户名 密码等这个概念)
*/
public class DBHelper extends SQLiteOpenHelper{
/**
* 构造:4个参数
* @param context 上下文
* @param name 数据库的名字,sqlite数据库本质也是一个文件 这个name也被称为“文件名” 一般以.db为结尾
* @param factory 数据库工厂,一般为null
* @param version 数据库的版本(例如加表的情况,1.0版本,2.0版本等)
*/
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.i("test","构造方法");//打印测试一下
}
//使用该方法:创建表
//只会调用一次(因为第一次表就已经创建好了)
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("test","创建表");
db.execSQL("create table login(uid integer primary key autoincrement,uname,upass)");//创建表的sql语句 主键:primary key 自动增长:autoincrement
}
//数据库版本升级 低-->高(想加一个表,及版本从1.0改为2.0自动调用此方法)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("test","升级数据库版本");
}
//降级:3.0版本改为2.0版本(一般情况下不会存在)
// @Override
// public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// super.onDowngrade(db, oldVersion, newVersion);
// }
}
MyProvider.java
package com.zking.provider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.zking.db.DBHelper;
/**
* 我的内容提供者
*
*/
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
Log.i("test","onCreate");
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
Log.i("test","query");
//拿到DBHelper这个类
DBHelper dbHelper=new DBHelper(getContext(),"databaseName.db",null,1);//getContext()上下文对象
SQLiteDatabase sqLiteDatabase = dbHelper.getWritableDatabase();
return sqLiteDatabase.rawQuery("select * from login",null);//没有参数为null
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.i("test","insert");
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.i("test","delete");
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
Log.i("test","update");
return 0;
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zking.android25_contentprovider">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--配置内容提供者-->
<provider
android:authorities="com.zking.android25_contentprovider.ZHONGZI"
android:name="com.zking.provider.MyProvider"
android:exported="true"
>
</provider><!--作者(网址 包名.种子网): exported:可访问-->
</application>
</manifest>
android25_contentresolver项目
MainActivity.java
package com.zking.android25_contentresolver;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
/**
* 内容访问者(实际生活中用的比内容提供者多)
* 应用程序一启动就拿数据
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取android25_contentprovider的数据
//获取内容访问者
ContentResolver cr=getContentResolver();
//content协议:域名
Uri uri=Uri.parse("content://com.zking.android25_contentprovider.ZHONGZI");
//传参
//cr.query(uri,null,null,null,null);
Cursor cursor=cr.query(uri,null,null,null,null);
while(cursor.moveToNext()){//拿值
String uname=cursor.getString(cursor.getColumnIndex("uname")) ;//列名可以改为用下标0,1,2等
Log.i("test",uname);
}
}
}
效果图