描述: contentProvider主要用在不用应用之间的数据共享
注意: 在第二个用用获取第一个应用的数据时,必须保证第一个应用是在运行着的。
效果展示
第一个应用 | 第二个应用 |
---|---|
package com.example.www.app2;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private MySQLiteDataBase mMySQLiteDataBase;
private SQLiteDatabase mDb;
private EditText mName;
private EditText mAge;
private TextView mContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMySQLiteDataBase = new MySQLiteDataBase(this);
mDb = mMySQLiteDataBase.getWritableDatabase();
mName = (EditText) findViewById(R.id.editText);
mAge = (EditText) findViewById(R.id.editText2);
mContent = (TextView) findViewById(R.id.textView);
}
public void insert(View view) {
String name = mName.getText().toString();
String age = mAge.getText().toString();
if(name.isEmpty() || age.isEmpty()) {
Toast.makeText(this, "年龄或姓名不能为空", Toast.LENGTH_SHORT).show();
return;
}
ContentValues cv = new ContentValues();
cv.put("name", name);
cv.put("age", Integer.parseInt(age));
long result = mDb.insert("user", null, cv);
if(result != -1) {
Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "插入失败", Toast.LENGTH_SHORT).show();
}
}
public void query(View view) {
Cursor cursor = mDb.query("user", null, null, null, null, null, null, null);
StringBuffer sb = new StringBuffer();
if(cursor.moveToFirst()) {
do {
sb.append("姓名: ").append(cursor.getString(cursor.getColumnIndex("name"))).append("年龄:").append(cursor.getInt(cursor.getColumnIndex("age")));
sb.append("\n");
} while (cursor.moveToNext());
cursor.close();
}
mContent.setText(sb.toString());
}
}
package com.example.www.app2;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyContentProvider extends ContentProvider {
// 1. 定义一个 urimathcher 定义路径匹配规则
private static final UriMatcher sURIMather = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERYSUCCESS = 1;
private static final int INSERTUCCESS = 2;
private static final int UPDATESUCCESS = 3;
private static final int DELETESUCCESS = 4;
// 2. 定义静态代码块 添加匹配规则
static {
// authority 和清单文件定义的要一样
sURIMather.addURI("com.wl.lhw", "query", QUERYSUCCESS);
sURIMather.addURI("com.wl.lhw", "insert", INSERTUCCESS);
sURIMather.addURI("com.wl.lhw", "update", UPDATESUCCESS);
sURIMather.addURI("com.wl.lhw", "delete", DELETESUCCESS);
}
private MySQLiteDataBase mOpenHelper;
@Override
public boolean onCreate() {
mOpenHelper = new MySQLiteDataBase(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
int code = sURIMather.match(uri);
if (code == QUERYSUCCESS) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Cursor cursor = db.query("user", projection, selection, selectionArgs, null, null, null);
return cursor;
} else {
throw new IllegalArgumentException("您的路径不匹配");
}
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int code = sURIMather.match(uri);
if (code == INSERTUCCESS) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
long user = db.insert("user", null, values);
Uri uri2 = Uri.parse("content://com.wl.insert/" + user);
return uri2;
} else {
throw new IllegalArgumentException("您的路径不匹配");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = sURIMather.match(uri);
if (code == DELETESUCCESS) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int user = db.delete("user", selection, selectionArgs);
return user;
} else {
throw new IllegalArgumentException("您的路径不匹配");
}
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int code = sURIMather.match(uri);
if (code == INSERTUCCESS) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
int user = db.update("user", values, selection, selectionArgs);
return user;
} else {
throw new IllegalArgumentException("您的路径不匹配");
}
}
}
package com.example.www.app2;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLiteDataBase extends SQLiteOpenHelper {
public MySQLiteDataBase(Context context) {
super(context, "test.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(20), age int)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
<android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="180dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:hint="姓名"
android:inputType="textPersonName"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" />
<EditText
android:id="@+id/editText2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:ems="10"
android:hint="年龄"
android:inputType="number"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/editText"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="插入"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText"
android:onClick="insert"/>
<Button
android:id="@+id/button2"
android:layout_width="362dp"
android:layout_height="wrap_content"
android:layout_marginStart="164dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="8dp"
android:text="查询"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button"
android:onClick="query"/>
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:textColor="@android:color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
android.support.constraint.ConstraintLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.www.app2">
<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:name=".MyContentProvider"
android:exported="true"
android:authorities="com.wl.lhw">
provider>
application>
manifest>
package com.example.www.providerdemo;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.net.URI;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView mTv_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv_content = (TextView) findViewById(R.id.textView);
}
public void query(View view) {
Uri uri = Uri.parse("content://com.wl.lhw/query"); // 路径和 定义的路径一样(在contentProvider中定义的)
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
StringBuffer sb = new StringBuffer();
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
sb.append("姓名: ").append(name).append("----").append("年龄: ").append(age);
sb.append("\n");
} while (cursor.moveToNext());
mTv_content.setText(sb.toString());
}
}
public void insert(View view) {
Uri uri = Uri.parse("content://com.wl.lhw/insert"); // 路径和 定义的路径一样(在contentProvider中定义的)
ContentValues cv = new ContentValues();
cv.put("name", "lhw" + Math.random());
cv.put("age", 20);
Uri insert = getContentResolver().insert(uri, cv);
System.out.println("insert: " + insert);
}
public void update(View view) {
Toast.makeText(this, "暂时没做更新数据", Toast.LENGTH_SHORT).show();
}
public void delete(View view) {
Toast.makeText(this, "暂时没做删除数据", Toast.LENGTH_SHORT).show();
}
}
<android.support.constraint.ConstraintLayout 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"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:onClick="query"
android:text="查询"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
<Button
android:id="@+id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="插入"
app:layout_constraintEnd_toStartOf="@+id/button3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick="insert"/>
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="修改"
app:layout_constraintEnd_toStartOf="@+id/button4"
app:layout_constraintTop_toTopOf="parent"
android:onClick="update"/>
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:text="删除"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:onClick="delete"/>
android.support.constraint.ConstraintLayout>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.www.providerdemo">
<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>
application>
manifest>