您的位置:首页 > 移动开发 > Android开发

编写提供程序数据外部接口的程序

2017-07-26 00:07 399 查看
上一篇文章讲了如何去访问其他程序暴露出来的数据,那么这篇文章就来讲一下如何暴露数据给外部程序访问。要暴露数据给外部程序,我们要使用ContentProvider,创建一个类去继承ContentProvider实现一个我们自己的内容提供器,并实现其中的抽象方法。具体实例如下:新建一个SqliteDatabae项目,其中:

activity_main.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:id="@+id/createDatabase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create Database"
android:textAllCaps="false"/>

<Button
android:id="@+id/addData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add Data"
android:textAllCaps="false"/>

<Button
android:id="@+id/updateData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update Data"
android:textAllCaps="false"/>

<Button
android:id="@+id/deleteData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Delete Data"
android:textAllCaps="false"/>

<Button
android:id="@+id/queryData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Query Data"
android:textAllCaps="false"/>

</LinearLayout>


AndroidManifest.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tangliang.sqlitedatabase">

<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=".StudentProvider"
android:authorities="com.tangliang.sqlitedatabase.provider"
android:enabled="true"
android:exported="true"></provider>
</application>

</manifest>


MyDatabaseHelper类中的代码如下:

package com.tangliang.sqlitedatabase;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
* Created by tangliang on 2017-07-25.
*/

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_STUDENT = "create table Student ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer)";

public static final String CREATE_COURSE = "create table Course ("
+ "id integer primary key autoincrement, "
+ "courseName text, "
+ "courseCredit integer)";

private Context mContext;

public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, name, factory, version);
mContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_STUDENT);
db.execSQL(CREATE_COURSE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Student");
db.execSQL("drop table if exists Course");
onCreate(db);
}
}


StudentProvider中的代码如下:

package com.tangliang.sqlitedatabase;

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 StudentProvider extends ContentProvider {

public static final int STUDENT_DIR = 0;

public static final int STUDENT_ITEM = 1;

public static final int COURSE_DIR = 2;

public static final int COURSE_ITEM = 3;

public static final String AUTHORITY = "com.tangliang.sqlitedatabase.provider";

private static UriMatcher uriMatcher;

private MyDatabaseHelper dbHelper;

static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "student", STUDENT_DIR);
uriMatcher.addURI(AUTHORITY, "student/#", STUDENT_ITEM);
uriMatcher.addURI(AUTHORITY, "course", COURSE_DIR);
uriMatcher.addURI(AUTHORITY, "course/#", COURSE_ITEM);
}

public StudentProvider() {
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deletedRows = 0;
switch (uriMatcher.match(uri)){
case STUDENT_DIR:
deletedRows = db.delete("Student", selection, selectionArgs);
break;
case STUDENT_ITEM:
String studentId = uri.getPathSegments().get(1);
deletedRows = db.delete("Student", "id = ?", new String[]{studentId});
break;
case COURSE_DIR:
deletedRows = db.delete("Course", selection, selectionArgs);
break;
case COURSE_ITEM:
String courseId = uri.getPathSegments().get(1);
deletedRows = db.delete("Course", "id = ?", new String[]{courseId});
break;
default:
break;
}
return deletedRows;
}

@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
case STUDENT_DIR:
return "vnd:android.cursor.dir/vnd.com.tangliang.sqlitedatabase.provider.student";
case STUDENT_ITEM:
return "vnd:android.cursor.item/vnd.com.tangliang.sqlitedatabase.provider.student";
case COURSE_DIR:
return "vnd:android.cursor.dir/vnd.com.tangliang.sqlitedatabase.provider.course";
case COURSE_ITEM:
return "vnd:android.cursor.item/vnd.com.tangliang.sqlitedatabase.provider.course";
}
return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)){
case STUDENT_DIR:
case STUDENT_ITEM:
long newStudentId = db.insert("Student", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/student/" + newStudentId);
break;
case COURSE_DIR:
case COURSE_ITEM:
long newCourseId = db.insert("Course", null, values);
uriReturn = Uri.parse("content://" + AUTHORITY + "/course/" + newCourseId);
break;
default:
break;
}
return uriReturn;
}

@Override
public boolean onCreate() {
dbHelper = new MyDatabaseHelper(getContext(), "Student.db", null, 2);
return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)){
case STUDENT_DIR:
cursor = db.query("Student", projection, selection, selectionArgs, null, null, sortOrder);
break;
case STUDENT_ITEM:
String studentId = uri.getPathSegments().get(1);
cursor = db.query("Student", projection, "id = ?", new String[]{ studentId }, null, null, sortOrder);
break;
case COURSE_DIR:
cursor = db.query("Course", projection, selection, selectionArgs, null, null
c032
, sortOrder);
break;
case COURSE_ITEM:
String courseId = uri.getPathSegments().get(1);
cursor = db.query("Course", projection, "id = ?", new String[]{courseId}, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updatedRows = 0;
switch (uriMatcher.match(uri)){
case STUDENT_DIR:
updatedRows = db.update("Student", values, selection, selectionArgs);
break;
case STUDENT_ITEM:
String studentId = uri.getPathSegments().get(1);
updatedRows = db.update("Student", values, "id = ?", new String[]{ studentId });
break;
case COURSE_DIR:
updatedRows = db.update("Course", values, selection, selectionArgs);
break;
case COURSE_ITEM:
String courseId = uri.getPathSegments().get(1);
updatedRows = db.update("Course", values, "id = ?", new String[] {courseId});
break;
default:
break;
}
return updatedRows;
}
}


MainActivity中的代码如下:

package com.tangliang.sqlitedatabase;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private MyDatabaseHelper myDatabaseHelper;

private Button createDatabase;

private Button addData;

private Button updateData;

private Button deleteData;

private Button queryData;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "Student.db", null, 2);
createDatabase = (Button) findViewById(R.id.createDatabase);
addData = (Button) findViewById(R.id.addData);
updateData = (Button) findViewById(R.id.updateData);
deleteData = (Button) findViewById(R.id.deleteData);
queryData = (Button) findViewById(R.id.queryData);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();
}
});
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "tangliang");
values.put("age", 21);
db.insert("Student", null, values);
values.clear();
}
});
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 18);
db.update("Student", values, "name = ?", new String[] {"tangliang"});
}
});
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
db.delete("Student", "name = ?", new String[]{"tangliang"});
}
});
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase();
Cursor cursor = db.query("Student", null, null, null, null, null, null);
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d("MainActivity", "My name is " + name);
Log.d("MainActivity", "I'm " + age + " years old");
}
while(cursor.moveToNext());
}
cursor.close();
}
});
}
}


这样暴露数据给其他程序的程序就写好了,接下来写个StudentProviderTest程序进行测试

activity_main.xml中的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
android:id="@+id/addData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add To Student"/>

</LinearLayout>


MainActivity中的代码如下:

package com.tangliang.studentprovidertest;

import android.content.ContentValues;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

private String newId;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button addData = (Button) findViewById(R.id.addData);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse("content://com.tangliang.sqlitedatabase.provider/student");
ContentValues values = new ContentValues();
values.put("name", "tangliang1");
values.put("age", 23);
Uri newUri = getContentResolver().insert(uri, values);
newId = newUri.getPathSegments().get(1);
}
});
}
}


这里只测试了添加数据,其他操作也是类似的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐