最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
values.put(“pages”, 454);
values.put(“price”, 16.96);
db.insert(“Book”, null, values); // 插入第一条数据
values.clear(); // 清空values中的数据
values.put(“name”, “The Lost Symbol”);
values.put(“author”, “Dan Brown”);
values.put(“pages”, 510);
values.put(“price”, 19.95);
db.insert(“Book”, null, values); // 插入第二条数据
}
});
//更新数据
update_data.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(“price”, 10.99);
// 参数:表名,ContentValues对象封装的数据,更新哪一行(去更新name=?,而?占一个占位符),可以通过
// 第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容.
// 第三个参数对应sql语句的where部分
int count = db.update(“Book”, values, “name = ?”,
new String[] { “The Da Vinci Code” });
// 上述代码的意图是,将名字为"The DaVinci Code"的这本书价格改成10.99
}
});
//删除数据
delete_data.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
//表名,where部分,?
//删除大于500页的书
db.delete(“Book”, “pages > ?”, new String[]{“500”});
}
});
//查询数据
query_data.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//调用query()方法后悔返回一个Cursor对象,查询到的所有数据都将从这个对象中取出
SQLiteDatabase db = dbHelper.getWritableDatabase();
//参数:表名,列名,where部分,为占位符指定具体的值,group by的列,对group by后的结果进一步约束,查询结果排序方式
//查询Book表中的所有数据,并存到Cursor对象中
Cursor cursor = db.query(“book”, null, null, null, null, null, null, null);
//moveToFirst()方法将数据的指针移动到第一行的位置,然后循环查询每一行的数据
//通过Cursor的getColumnIndex()方法获取到某一列在表中对应位置索引
//然后再将这个索引传入到相应的取值方法中,就可以得到从数据库中读取到的数据了
//最后需要用close()方法关闭Cursor
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex(“name”));
String author = cursor.getString(cursor.getColumnIndex(“author”));
int pages = cursor.getInt(cursor.getColumnIndex(“pages”));
double price = cursor.getDouble(cursor.getColumnIndex(“price”));
Log.d(“xfhy”,“name :”+name);
Log.d(“xfhy”,“author :”+author);
Log.d(“xfhy”,“pages :”+pages);
Log.d(“xfhy”,“price :”+price);
}while(cursor.moveToNext());
}
cursor.close();
}
});
//使用事务,替换数据 要么删除旧数据和添加新数据的操作一起完成,要么就还要保留原来的旧数据
//事务的特性就是保证让某一系列操作要么全部完成,要么一个都不会完成
//这里是事务的标准写法
replace_data.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction(); //开启事务
try {
db.delete(“Book”, null, null); //这里表示删除Book表里的全部数据
/*if(true){ //这里是故意让事务失败的,为了测试
throw new NullPointerException(); //手动抛出异常,让事务失败
}*/
ContentValues values = new ContentValues();
values.put(“name”, “Game of Thrones”);
values.put(“author”, “George Martin”);
values.put(“pages”, 720);
values.put(“price”, 20.85);
db.insert(“Book”,null,values); //添加数据
db.setTransactionSuccessful(); //事务已成功执行
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction(); //结束事务
}
}
});
}
}
继承SQLiteOpenHelper,并完成构造方法的实现,实现onCreate()和onUpgrade()方法
建表语句,integer是整型,text是文本,real是浮点型,blob是二进制类型
用adb命令去打开数据库目录的话,需要将platform-tools配置到Path环境变量中去.然后cmd->adb shell
打开数据库所在目录/data/data/com.example.databasetest/databases
再ls 可以看到当前的数据库BookStore.db已经在里面了,输入sqlite3 BookStore.db
可以用sqlite3工具打开数据库,然后输入.schema可以显示当前数据库的创建的语句
这里是升级数据库的最佳写法:
用户是第一次安装这个软件,则建立2张表
用户是升级数据库,则判断一下是不是通过老版本来更新的,只需要创建1张表Category即可
这里升级数据库时,没有break语句,这是为了保证每一次的数据库修改都能被全部执行到.
比如我现在是数据库版本1,我安装了最新的软件,就需要升级到数据库版本3,就需要做1->2,2->3的所有操作
public class MyDatabaseHelper extends SQLiteOpenHelper{
//存放书的各种详细数据
private static final String CREATE_BOOK = “create table Book(” +
"id integer primary key autoincrement, " +
"author text, " +
"price real, " +
"pages integer, " +
"name text, " +
“category_id integer)”; //第三版的数据库(假设数据库升级),加了这个属性
//存放分类名,分类代码等
private static final String CREATE_CATEGORY = “create table Category (” + //数据库升级到第二本时,新增了这个表
"id integer primary key autoincrement, " +
"category_name text, " +
“category_code integer)”;
/**
-
@param context 上下文
-
@param name 数据库名称
-
@param factory 返回自定义的Cursor,一般传入null
最后
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。
所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。
如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
看到应有的效果,会气馁是再正常不过的。
所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。
如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!