Android最全实例教程九:采用ContentProvider对外共享数据,2024年最新面试必会的算法

总结

【Android 详细知识点思维脑图(技能树)】

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

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

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

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

    }



    @Override

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

                    String\[\] selectionArgs, String sortOrder) { //可以供外部应用查询内容提供者提供的数据

            SQLiteDatabase db = dbOpenHelper.getReadableDatabase();

            Cursor cursor \= null;

            switch (MATCHER.match(uri)) {

            case 1:

                    cursor \= db.query("person", projection, selection, selectionArgs, 

                                    null, null, sortOrder);        

                    break;

                    

            case 2:

                    int rowId = (int) ContentUris.parseId(uri);

                    String where \= "personId=?" + rowId;

                    if(selection != null && !"".equals(selection.trim())){

                            where += " and" + selection;

                    }

                    cursor \= db.query("person", projection, where, selectionArgs, 

                                    null, null, sortOrder);        

                    break;

                    

            default:

                    throw new IllegalArgumentException("this is Unknown Uri:" + uri);

            }

            return cursor;

    }

    

    /\*\*

     \* 2种方法

     \* 1.查询所有 /person

     \* 2.查询指定的ID /person/10

     \* 该方法用于返回当前Uri所代表数据的MIME类型,如果操作的数据属于集合类型

     \* 那么,MIME类型字符串应该以vnd.android.cursor.dir/开头

     \* 例:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person

     \* 那么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person

     \* 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该为:

     \* vnd.android.cursor.item/开头

     \* 例:得到Id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10

     \* 那么 返回的MIME类型字符串应该为vnd.android.cursor.item/person

     \*/

    @Override

    public String getType(Uri uri) { //返回你现在要操作的数据的内容类型

            switch (MATCHER.match(uri)) {

            case 1:

                    return "vnd.android.cursor.dir/person";

                    

            case 2:

                    return "vnd.android.cursor.item/person";

                    

            default:

                    throw new IllegalArgumentException("this is Unknown Uri:" + uri);

            }

    }

    

    /\*\*

     \* 2种方法

     \* 1.删除所有 /person

     \* 2.删除指定的ID /person/10

     \*/

    @Override

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

            SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();

            int num = 0;

            switch (MATCHER.match(uri)) {

            case 1:

                    num \= db.delete("person", selection, selectionArgs);                        

                    break;

                    

            case 2:

                    int rowId = (int) ContentUris.parseId(uri);

                    String where \= "personId=?" + rowId;

                    if(selection != null && !"".equals(selection.trim())){

                            where += " and" + selection;

                    }

                    num \= db.delete("person", where, selectionArgs);        

                    break;

                    

            default:

                    throw new IllegalArgumentException("this is Unknown Uri:" + uri);

            }

            return num;

    }        



    @Override

    public Uri insert(Uri uri, ContentValues values) {

            SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();

            switch (MATCHER.match(uri)) {

            case 1:

                    long rowId = db.insert("person", "name", values); //如果主键是整数则rowId=主键

                    // content://cn.itcast.provides.personprovider/person/10

                    //第一种写法

                    //Uri insertUri = Uri.parse("content://cn.itcast.providers.personprovider/person/" + rowId);

                    //第2种写法

                    Uri insertUri = ContentUris.withAppendedId(uri, rowId);

                    return insertUri;



            default:

                    throw new IllegalArgumentException("this is Unknown Uri:" + uri);

            }

    }        



    /\*\*

     \* 2种方法

     \* 1.更新所有 /person

     \* 2.更新指定的ID /person/10

     \*/

    @Override

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

                    String\[\] selectionArgs) {

            SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();

            int num = 0;

            switch (MATCHER.match(uri)) {

            case 1:

                    num \= db.update("person", values, selection, selectionArgs);                        

                    break;

                    

            case 2:

                    int rowId = (int) ContentUris.parseId(uri);

                    String where \= "personId=?" + rowId;

                    if(selection != null && !"".equals(selection.trim())){

                            where += " and" + selection;

                    }

                    num \= db.update("person", values, where, selectionArgs);

                    break;

                    

            default:

                    throw new IllegalArgumentException("this is Unknown Uri:" + uri);

            }

            return num;

    }

}




新建一个Other应用程序,添加调用ContentProvider的类



package cn.itcast.test;

import android.content.ContentResolver;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

import android.util.Log;

public class AccessContentProviderTest extends AndroidTestCase {

    private static final String TAG = "AccessContentProviderTest";

    

    public void testInsert() throws Exception{

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

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

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

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

n{

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

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

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

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值