编写提供程序数据外部接口的程序
2017-07-26 00:07
399 查看
上一篇文章讲了如何去访问其他程序暴露出来的数据,那么这篇文章就来讲一下如何暴露数据给外部程序访问。要暴露数据给外部程序,我们要使用ContentProvider,创建一个类去继承ContentProvider实现一个我们自己的内容提供器,并实现其中的抽象方法。具体实例如下:新建一个SqliteDatabae项目,其中:
activity_main.xml中的代码如下:
AndroidManifest.xml中的代码如下:
MyDatabaseHelper类中的代码如下:
StudentProvider中的代码如下:
MainActivity中的代码如下:
这样暴露数据给其他程序的程序就写好了,接下来写个StudentProviderTest程序进行测试
activity_main.xml中的代码如下:
MainActivity中的代码如下:
这里只测试了添加数据,其他操作也是类似的方法
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); } }); } }
这里只测试了添加数据,其他操作也是类似的方法
相关文章推荐
- webservice实际应用之调用外部系统提供的服务端地址,写java的webservice客户端程序并通过接口给外部系统传数据
- contentprovider提供程序间共享数据的统一接口
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- 小飞鱼通达二开 编写接口文件从通达OA外部提交数据更新用户信息
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)good
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- 使用外部程序为Query提供数据
- 编写高质量代码改善C#程序的157个建议——建议142:总是提供有意义的命名
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 编写了一个支持firefox和ie的javascript+xml进行数据分页的程序
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
- 用jfreechat编写图形化统计数据程序(实例)
- 数据结构:编写病人看病模拟程序(C/C 艹)
- 如何编写提供了IDisposable接口的类.
- 程序调试时用到的XML或者JSON数据接口(支持返回图片信息)
- 1.已知接口ComputerAverage,和主类Estimator,编写程序完成SongGame和School类。SongGame类能够根据歌手得分去掉一个最高分,去掉一个最低分,计算其余得分的平均
- 转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据