使用内容提供商进行Android开发和学习

电脑杂谈  发布时间:2020-07-07 07:14:19  来源:网络整理

记忆追寻者安卓版_安卓psp模拟器噬神者2dlc下载_安卓内容提供者

在过去的几天里,我学会了在Android进程之间进行通信,并且作为Android的四个主要组件之一安卓内容提供者,我还可以实现IPC.

现在记录使用步骤

1,创建DatabaseOpenHelper

内容提供者的工作方式与操作相同. 添加,删除,修改和检查,因此我们必须创建一个帮助器类来首先创建. 代码如下

安卓内容提供者_安卓psp模拟器噬神者2dlc下载_记忆追寻者安卓版

public class MyDbHelper extends SQLiteOpenHelper {     public static final String DB_NAME = "peopleDatabase.db";     public static final String TABLE_NAME = "person";     public static final int VERSION = 1;      public MyDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {         this(context);     }      public MyDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {         this(context);     }      public MyDbHelper(Context context) {         super(context, DB_NAME, null, VERSION, null);     }      @Override     public void onCreate(SQLiteDatabase db) {         String sql = "create table if not exists " + TABLE_NAME + "(id int(3) not null, name varchar(20), description varchar(50), " +                                 "constraint PK_PERSON primary key(id))";         db.execSQL(sql);     }      @Override     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {      } }

2. 创建自己的内容提供商

代码如下

public class PersonProvider extends ContentProvider {     private static final String TAG = "PersonProvider";     private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH); // uri匹配者     public static final String AUTH = "com.example.songzeceng.PersonProvider"; // 内容提供者的id     public static final Uri PERSON_URI = Uri.parse("content://" + AUTH + "/person");     public static final String TYPE_MORE = "vnd.android.cursor.dir/person"; // 多条查询的type     public static final String TYPE_SINGAL = "vnd.android.cursor.item/person"; // 单条查询的type     public static final int CODE_SINGAL = 0; // 单条查询的匹配码     public static final int CODE_MORE = 1; // 多条查询的匹配码      public static String TABLE_NAME = "person";      private SQLiteDatabase mDatabase;     private Context mContext;      static {         MATCHER.addURI(AUTH, "person", CODE_MORE); // 多条查询         MATCHER.addURI(AUTH, "person/#", CODE_SINGAL); // 单条查询,#是数字通配符,理解为id     }      @Override     public boolean onCreate() {         mContext = getContext();         mDatabase = new MyDbHelper(mContext).getWritableDatabase(); // 获取可写,可写自然可读         return false;     }      @Override     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 参数列表:表的uri、要查询的列、where子句、where子句的参数、排序语句         System.out.println("query uri:"+uri.toString());         String type = getType(uri);         if (isTypeValid(type)) {             Cursor cursor = mDatabase.query(TABLE_NAME, projection, selection, selectionArgs, null, sortOrder, null); // 两个null分别是groupBy和orderBy             return cursor; // 返回的是游标         }         return null;     }      private boolean isTypeValid(String type) {         return type != null && (TYPE_MORE.equals(type) || TYPE_SINGAL.equals(type));     }      @Override     public String getType(Uri uri) {         int code = MATCHER.match(uri);         switch (code) {             case CODE_SINGAL:                 return TYPE_SINGAL;             case CODE_MORE:                 return TYPE_MORE;         }         return null;     }      @Override     public Uri insert(Uri uri, ContentValues values) {         System.out.println("insert uri:"+uri.toString() + "--contentValues:"+values.toString());         if (isTypeValid(getType(uri))) {             mDatabase.insert(TABLE_NAME, null, values); // null是nullColumnHack,用于插入空行(也就是ContentValues内容是空)             mContext.getContentResolver().notifyChange(uri, null); // null是observer,观察者         }         return null;     }      @Override     public int delete(Uri uri, String selection, String[] selectionArgs) { // 参数列表:uri、where子句、where参数         System.out.println("delete uri:"+uri.toString());         if (isTypeValid(getType(uri))) {             int count = mDatabase.delete(TABLE_NAME, selection, selectionArgs);             if (count > 0) {                 mContext.getContentResolver().notifyChange(uri ,null);             }         }         return 0;     }      @Override     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {         System.out.println("update uri:"+uri.toString() + "--contentValues:"+values.toString());         if (isTypeValid(getType(uri))) {             int count = mDatabase.update(TABLE_NAME, values, selection, selectionArgs);             if (count > 0) {                 mContext.getContentResolver().notifyChange(uri, null);             }         }         return 0;     } }

安卓内容提供者_安卓psp模拟器噬神者2dlc下载_记忆追寻者安卓版

您可以看到已添加和更改的内容位于ContentValues中,这等效于哈希映射

selection是where子句,而selectionArgs是一个参数. 如果选择是“ where id =?and name =?”,而selectionArgs是[1,“ szc”],则完整的where子句是“ where id” = 1且name = \“ szc \”“

但是,我直接将参数拼接到选择中,所以selectionArgs成为了装饰

此外,添加方法的返回值是表的url,修改和删除的返回值是受影响的行数. 感觉没用.

记忆追寻者安卓版_安卓内容提供者_安卓psp模拟器噬神者2dlc下载

3. 在清单文件中注册

        <provider             android:name=".PersonProvider" <!--provider类名-->             android:authorities="com.example.songzeceng.PersonProvider" <!--provider的id-->             android:exported="true"  <!--是否允许别的进程访问-->             android:grantUriPermissions="true" <!--是否允许解析uri-->             android:process=":provider"> <!--provider所属进程名-->          </provider>


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-271454-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...