Android程序员面试宝典
自定义控件
- 一分钟实现贴纸功能
- 一分钟实现TextView高亮
- 一分钟实现新手引导页
- 一分钟实现ViewPager卡片
- 一分钟实现加载对话框
- 一分钟实现轮播图
- 一分钟实现GridView拖拽
- 一分钟实现底部导航栏
- 一分钟实现底部FragmentTabhost
- 一分钟实现多张图片选择
- 一分钟实现仿美拍直播的点赞动画
- 一分钟实现高仿今日头条视频列表
- 一分钟实现购物车加减控件
- 一分钟实现省市县三级联动
- 一分钟实现二维码生成和扫描
- 一分钟实现沉浸式状态栏
- 一分钟实现图片裁剪
- 一分钟实现视频弹幕
- 一分钟实现图片缩放
- 一分钟实现旋转选择器
- 一分钟实现ofo小黄车的引导界面
- 一分钟实现自定义ImageView外貌
- 一分钟实现向左拖拽跳转详情页
- 一分钟实现QQ首页动画特效
- 一分钟实现ViewPager上下滑动
联网
- 一分钟学会Retrofit并且进行实战
- 一分钟实现OkHttp3
工具
- 一分钟实现RecyclerView
- 一分钟实现H5和Android通信
- 一分钟实现pinyin4j
- 一分钟实现分析内存泄漏
数据库
- 一分钟实现LitePal数据库
- 一分钟实现ormlite数据库
- 一分钟实现GreenDao数据库
源码分析相关面试题
- Volley源码分析
- 注解框架实现原理
- okhttp3.0源码分析
- onSaveInstanceState源码分析
- 静默安装和源码编译
Activity相关面试题
- 保存Activity的状态
- 深刻剖析activity启动模式(一)
- 深刻剖析activity启动模式(二)
- 深刻剖析activity启动模式(三)
- Activity Task和Process之间的关系
- 源码分析service开启Activity抛异常?activity不会抛异常
- Activity优雅退出
- onCreate源码分析
Service相关面试题
- IntentService源码分析
- Service是否在main thread中执行, service里面是否能执行耗时的操作?
- Service不死之身
与XMPP相关面试题
- XMPP协议优缺点
- 极光消息推送原理
与性能优化相关面试题
- 内存泄漏和内存溢出区别
- UI优化和线程池实现原理
- 代码优化
- 内存性能分析
- 内存泄漏检测
- App启动优化
- 与IPC机制相关面试题
与登录相关面试题
- oauth认证协议原理
- token产生的意义
- 微信扫一扫实现原理
与开发相关面试题
- 迭代开发的时候如何向前兼容新旧接口
- 手把手教你如何解决as jar包冲突
- context的原理分析
- 解决ViewPager.setCurrentItem中间很多页面切换方案
- 字体适配
- 软键盘适配
- 机型适配,例如三星、小米、华为、魅族等
- CardView 设置水波纹效果
与人事相关面试题
- 人事面试宝典
- 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频
微信公众号名称:Android干货程序员
- 配套视频
开源项目总贴地址:https://github.com/open-android/Android
数据库LitePal地址:https://github.com/open-android/LitePal
省市县三级联动地址:https://github.com/open-android/CityPickerWebView
BaseRecyclerAndAdapter地址:https://github.com/open-android/BaseRecyclerAndAdapter
使用步骤
1. 在project的build.gradle添加如下代码(如下图)
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2. 在Module的build.gradle添加依赖
compile 'org.litepal.android:core:1.5.1'
compile 'com.github.open-android:BaseRecyclerAndAdapter:0.5.13'
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
compile 'com.github.open-android:CityPickerWebView:0.1.0'
LitePal数据库使用
Eclipse使用jar包下载
- litepal-1.5.1.jar (library contains *.class files)
- litepal-1.5.1-src.jar (library contains *.class files and *.java files)
LitePal的快速配置
1. 引入Jar包或源码
Using Eclipse
- 使用Eclipse到 here 下载好了jar包之后,把它复制到项目的libs目录中就算是引入成功了。
使用Android Studio在项目的build.gradle中添加:
dependencies {
compile 'org.litepal.android:core:1.5.1'
}
2. 配置litepal.xml
在项目的assets目录下面新建一个litepal.xml文件,内容如下:
是数据库的名字 是数据库的版本号 - 是数据库的映射模型(数据库表)
是数据库的映射模型的地址(数据库表结构)
3. 配置LitePalApplication
在AndroidManifest.xml中配置LitePalApplication,如下:
...
如果已经有自己的Application,那么久继承一下就好了,如下:
public class MyOwnApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
...
}
1. LitePal的建表
根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),建表先要新建一个模型类,新建一个DEST类,如下:
public class DEST extends DataSupport {
private String destId;//目的地ID
private String cnName;//中文名
private String enName;//英文名
private String parentId;
private String childrenId;
private long updateTime;
// 自动生成get、set方法
}
LitePal的映射规则是非常轻量级的,不像一些其它的数据库框架,需要为每个模型类单独配置一个映射关系的XML,LitePal的所有映射都是自动完成的。根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不需要进行任何额外的配置。
注意
只有private修饰的字段才会被映射到数据库表中,即如果有某一个字段不想映射的话,就设置为public、protected或者default修饰符就可以了。
- 建立好Model后,我们就把他配置到映射列表中,即编辑assest目录下的litepal.xml文件,在
- 标签中加入DEST类的声明,这里要注意,要类的完整类名。
到这里,就完成了LitePal数据库的配置。
LitePal的升级表
1.添加新表
首先创建一个新的模型类,然后把它设置到litepal.xml中,如下:
然后,把litepal.xml中的version的值加一即可,如下:
2.旧表添加新列
首先在需要升级的模型类中添加新的private修饰的字段,如下:
public class DEST extends DataSupport {
private String destId;//目的地ID
private String cnName;//中文名
private String enName;//英文名
private String parentId;
private String childrenId;
private long updateTime;
private String imagePath;//(新增加的列)
// 自动生成get、set方法
}
然后再把litepal.xml中的version的值加一即可,如下:
LitePal的存储操作
- LitePal要存储数据,首先模型类要继承DataSupport,即:
public class DEST extends DataSupport {
}
继承了DataSupport类之后,这些实体类就拥有了进行CRUD操作的能力。
3. 存储操作:
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
Song song1 = new Song();
song1.setName("song1");
song1.setDuration(320);
song1.setAlbum(album);
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album);
song2.save();
并且save()操作是有返回值的,所以可以这样:
if (mDest.save()) {
Toast.makeText(context, "存储成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "存储失败", Toast.LENGTH_SHORT).show();
}
4. LitePal的修改操作
如果想把DEST表中id为4的destId改为"1",可以这样写:
ContentValues values = new ContentValues();
values.put("destId", "1");
DataSupport.update(DEST.class, values, 4);
//或者用下面这种方法
DEST updateNews = new DEST();
updateNews.setDestId("1");
updateNews.update(4);
如果想把DEST表中所有destId为"1"的改为"2"可以这样写:
ContentValues values = new ContentValues();
values.put("destId", "2");
DataSupport.updateAll(DEST.class, values, "destId = ?", "1");
//或者用下面这种方法
DEST updateNews = new DEST();
updateNews.setdestId("2");
updateNews.updateAll("destId = ?", "1");
5. LitePal的删除操作
比如说我们想删除DEST表中id为2的记录,就可以这样写
DataSupport.delete(Song.class, 2);
想把DEST表中destId为“1”的所有数据删除,就可以这样写:
DataSupport.deleteAll(DEST.class, "destId = ? ", "1");
如果我们想把DEST表中所有的数据全部删除掉,就可以这样写:
DataSupport.deleteAll(DEST.class);
6. LitePal的查询操作
LitePal的查询操作
查询DEST表中id为1的这条记录,使用LitePal就可以这样写:
DEST mDest = DataSupport.find(DEST.class, 1);
想要获取DEST表中的第一条数据,只需要这样写:
DEST firstDest = DataSupport.findFirst(DEST.class);
想要获取News表中的最后一条数据,只需要这样写:
DEST lastDest = DataSupport.findLast(DEST.class);
想把DEST表中id为1、3、5、7的数据都查出来,只需要这样写:
List mDestList = DataSupport.findAll(DEST.class, 1, 3, 5, 7);
查询所有数据,只需要这样写:
List mDestList = DataSupport.findAll(DEST.class);
想查询DEST表中所有父类id为"1"的数据,就可以这样写:
List mDestList = DataSupport.where("parentId = ?", "1").find(DEST.class);
许你并不需要那么多的数据,而是只要cnName和enName这两列数据。那么也很简单,我们只要再增加一个连缀就行了,如下所示:
List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").find(DEST.class);
也许你还要数据按照添加的时间倒序排列,那么可以这样:
List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").find(DEST.class);
数据太多了,其实你只要前10行就行了,那么可以这样:
List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).find(DEST.class);
如果我们想进行分页展示,那么翻页了,怎么办?可以添加一个偏移量就好了,这样:
List mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).offset(10).find(DEST.class);
LitePal的聚合函数
count()
如果想统计行数,那么就可以调用count()即可:
int result = DataSupport.count(DEST.class);
如果想统计parentId为"1"的数据的行数,那么可以这样:
int result = DataSupport.where("parentId = ?", "1").count(DEST.class);
sum()
如果想统计一下DEST表中,所有updateTime的和(虽然毫无用处....),那么可以这样:
long result = DataSupport.sum(DEST.class, "updateTime", long.class);