当前位置:   article > 正文

2024年Android最全Android Content provider 组件(1),高级面试问题_android的provider

android的provider

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

public final class Employees {

// 授权常量

public static final String AUTHORITY = “com.amaker.provider.Employees”;

private Employees() {}

// 内部类

public static final class Employee implements BaseColumns {

// 构造方法

private Employee() {}

// 访问Uri

public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/employee”);

// 内容类型

public static final String CONTENT_TYPE = “vnd.android.cursor.dir/vnd.amaker.employees”;

public static final String CONTENT_ITEM_TYPE = “vnd.android.cursor.item/vnd.amaker.employees”;

// 默认排序常量

public static final String DEFAULT_SORT_ORDER = “name DESC”;// 按姓名排序

// 表字段常量

public static final String NAME = “name”; // 姓名

public static final String GENDER= “gender”; // 性别

public static final String AGE = “age”; // 年龄

}

}

/Chapter10_ContentProvider_01_Test02/src/com/amaker/ch10/app/EmployeeProvider.java

package com.amaker.ch10.app;

import java.util.HashMap;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteQueryBuilder;

import android.net.Uri;

import android.text.TextUtils;

import com.amaker.ch10.app.Employees.Employee;

public class EmployeeProvider extends ContentProvider{

// 数据库帮助类

private DBHelper dbHelper;

// Uri工具类

private static final UriMatcher sUriMatcher;

// 查询、更新条件

private static final int EMPLOYEE = 1;

private static final int EMPLOYEE_ID = 2;

// 查询列集合

private static HashMap<String, String> empProjectionMap;

static {

// Uri匹配工具类

sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

sUriMatcher.addURI(Employees.AUTHORITY, “employee”, EMPLOYEE);

sUriMatcher.addURI(Employees.AUTHORITY, “employee/#”, EMPLOYEE_ID);

// 实例化查询列集合

empProjectionMap = new HashMap<String, String>();

// 添加查询列

empProjectionMap.put(Employee._ID, Employee._ID);

empProjectionMap.put(Employee.NAME, Employee.NAME);

empProjectionMap.put(Employee.GENDER, Employee.GENDER);

empProjectionMap.put(Employee.AGE, Employee.AGE);

}

// 创建是调用

public boolean onCreate() {

// 实例化数据库帮助类

dbHelper = new DBHelper(getContext());

return true;

}

// 添加方法

public Uri insert(Uri uri, ContentValues values) {

// 获得数据库实例

SQLiteDatabase db = dbHelper.getWritableDatabase();

// 插入数据,返回行ID

long rowId = db.insert(DBHelper.EMPLOYEES_TABLE_NAME, Employee.NAME, values);

// 如果插入成功返回uri

if (rowId > 0) {

Uri empUri = ContentUris.withAppendedId(Employee.CONTENT_URI, rowId);

getContext().getContentResolver().notifyChange(empUri, null);

return empUri;

}

return null;

}

// 删除方法

public int delete(Uri uri, String selection, String[] selectionArgs) {

// 获得数据库实例

SQLiteDatabase db = dbHelper.getWritableDatabase();

// 获得数据库实例

int count;

switch (sUriMatcher.match(uri)) {

// 根据指定条件删除

case EMPLOYEE:

count = db.delete(DBHelper.EMPLOYEES_TABLE_NAME, selection, selectionArgs);

break;

// 根据指定条件和ID删除

case EMPLOYEE_ID:

String noteId = uri.getPathSegments().get(1);

count = db.delete(DBHelper.EMPLOYEES_TABLE_NAME, Employee._ID + “=” + noteId

  • (!TextUtils.isEmpty(selection) ? " AND (" + selection + ‘)’ : “”), selectionArgs);

break;

default:

throw new IllegalArgumentException("错误的 URI " + uri);

}

getContext().getContentResolver().notifyChange(uri, null);

return count;

}

// 获得类型

public String getType(Uri uri) {

return null;

}

// 查询方法

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

switch (sUriMatcher.match(uri)) {

// 查询所有

case EMPLOYEE:

qb.setTables(DBHelper.EMPLOYEES_TABLE_NAME);

qb.setProjectionMap(empProjectionMap);

break;

// 根据ID查询

case EMPLOYEE_ID:

qb.setTables(DBHelper.EMPLOYEES_TABLE_NAME);

qb.setProjectionMap(empProjectionMap);

qb.appendWhere(Employee._ID + “=” + uri.getPathSegments().get(1));

break;

default:

throw new IllegalArgumentException("Uri错误! " + uri);

}

// 使用默认排序

String orderBy;

if (TextUtils.isEmpty(sortOrder)) {

orderBy = Employee.DEFAULT_SORT_ORDER;

} else {

orderBy = sortOrder;

}

// 获得数据库实例

SQLiteDatabase db = dbHelper.getReadableDatabase();

// 返回游标集合

Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

c.setNotificationUri(getContext().getContentResolver(), uri);

return c;

}

// 更新方法

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

// 获得数据库实例

SQLiteDatabase db = dbHelper.getWritableDatabase();

int count;

switch (sUriMatcher.match(uri)) {

// 根据指定条件更新

case EMPLOYEE:

count = db.update(DBHelper.EMPLOYEES_TABLE_NAME, values, selection, selectionArgs);

break;

// 根据指定条件和ID更新

case EMPLOYEE_ID:

String noteId = uri.getPathSegments().get(1);

count = db.update(DBHelper.EMPLOYEES_TABLE_NAME, values, Employee._ID + “=” + noteId

  • (!TextUtils.isEmpty(selection) ? " AND (" + selection + ‘)’ : “”), selectionArgs);

break;

default:

throw new IllegalArgumentException("错误的 URI " + uri);

}

getContext().getContentResolver().notifyChange(uri, null);

return count;

}

}

/Chapter10_ContentProvider_01_Test02/src/com/amaker/ch10/app/DBHelper.java

package com.amaker.ch10.app;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import com.amaker.ch10.app.Employees.Employee;

/**

  • 数据库工具类

*/

public class DBHelper extends SQLiteOpenHelper{

// 数据库名称常量

private static final String DATABASE_NAME = “Employees.db”;

// 数据库版本常量

private static final int DATABASE_VERSION = 1;

// 表名称常量

public static final String EMPLOYEES_TABLE_NAME = “employee”;

// 构造方法

public DBHelper(Context context) {

// 创建数据库

super(context, DATABASE_NAME,null, DATABASE_VERSION);

}

// 创建时调用

public void onCreate(SQLiteDatabase db) {

db.execSQL(“CREATE TABLE " + EMPLOYEES_TABLE_NAME + " (”

  • Employee._ID + " INTEGER PRIMARY KEY,"

  • Employee.NAME + " TEXT,"

  • Employee.GENDER + " TEXT,"

  • Employee.AGE + " INTEGER"

  • “);”);

}

// 版本更新时调用

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// 删除表

db.execSQL(“DROP TABLE IF EXISTS employee”);

onCreate(db);

}

}

/Chapter10_ContentProvider_01_Test02/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

package=“com.amaker.ch10.app”

android:versionCode=“1”

android:versionName=“1.0”>

最后

想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

pk/res/android"

package=“com.amaker.ch10.app”

android:versionCode=“1”

android:versionName=“1.0”>

最后

想要了解更多关于大厂面试的同学可以点赞支持一下,除此之外,我也分享一些优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/936745
推荐阅读
相关标签
  

闽ICP备14008679号