自定义控件
- 一分钟实现贴纸功能
- 一分钟实现TextView高亮
- 一分钟实现新手引导页
- 一分钟实现ViewPager卡片
- 一分钟实现加载对话框
- 一分钟实现轮播图
- 一分钟实现GridView拖拽
- 一分钟实现底部导航栏
- 一分钟实现底部FragmentTabhost
- 一分钟实现多张图片选择
- 一分钟实现仿美拍直播的点赞动画
- 一分钟实现高仿今日头条视频列表
- 一分钟实现购物车加减控件
- 一分钟实现省市县三级联动
- 一分钟实现二维码生成和扫描
- 一分钟实现沉浸式状态栏
- 一分钟实现图片裁剪
- 一分钟实现视频弹幕
- 一分钟实现图片缩放
- 一分钟实现旋转选择器
- 一分钟实现ofo小黄车的引导界面
- 一分钟实现自定义ImageView外貌
- 一分钟实现向左拖拽跳转详情页
- 一分钟实现QQ首页动画特效
- 一分钟实现ViewPager上下滑动
联网
工具
数据库
源码分析相关面试题
Activity相关面试题
- 保存Activity的状态
- 深刻剖析activity启动模式(一)
- 深刻剖析activity启动模式(二)
- 深刻剖析activity启动模式(三)
- Activity Task和Process之间的关系
- 源码分析service开启Activity抛异常?activity不会抛异常
- Activity优雅退出
- onCreate源码分析
Service相关面试题
与XMPP相关面试题
与性能优化相关面试题
与登录相关面试题
与开发相关面试题
- 迭代开发的时候如何向前兼容新旧接口
- 手把手教你如何解决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文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--
Define the database name of your application.
By default each database name should be end with .db.
If you didn't name your database end with .db,
LitePal would plus the suffix automatically for you.
For example:
<dbname value="demo" />
-->
<dbname value="demo" />
<!--
Define the version of your database. Each time you want
to upgrade your database, the version tag would helps.
Modify the models you defined in the mapping tag, and just
make the version value plus one, the upgrade of database
will be processed automatically without concern.
For example:
<version value="1" />
-->
<version value="1" />
<!--
Define your models in the list with mapping tag, LitePal will
create tables for each mapping class. The supported fields
defined in models will be mapped into columns.
For example:
<list>
<mapping class="com.test.model.Reader" />
<mapping class="com.test.model.Magazine" />
</list>
-->
<list>
</list>
<!--
Define where the .db file should be. "internal" means the .db file
will be stored in the database folder of internal storage which no
one can access. "external" means the .db file will be stored in the
path to the directory on the primary external storage device where
the application can place persistent files it owns which everyone
can access. "internal" will act as default.
For example:
<storage value="external" />
-->
</litepal>
- <dbname>是数据库的名字
- <version>是数据库的版本号
- <list>是数据库的映射模型(数据库表)
- <mapping>是数据库的映射模型的地址(数据库表结构)
3. 配置LitePalApplication
在AndroidManifest.xml中配置LitePalApplication,如下:
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
如果已经有自己的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文件,在<list>标签中加入DEST类的声明,这里要注意,要类的完整类名。
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
</list>
</litepal>
到这里,就完成了LitePal数据库的配置。
LitePal的升级表
1.添加新表
首先创建一个新的模型类,然后把它设置到litepal.xml中,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="1" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
然后,把litepal.xml中的version的值加一即可,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="2" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
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的值加一即可,如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="white" ></dbname>
<version value="3" ></version>
<list>
<mapping class="com.whitelaning.example.litepal.DEST"></mapping>
<mapping class="com.whitelaning.example.litepal.SHOPPING"></mapping>
</list>
</litepal>
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<DEST> mDestList = DataSupport.findAll(DEST.class, 1, 3, 5, 7);
查询所有数据,只需要这样写:
List<DEST> mDestList = DataSupport.findAll(DEST.class);
想查询DEST表中所有父类id为"1"的数据,就可以这样写:
List<DEST> mDestList = DataSupport.where("parentId = ?", "1").find(DEST.class);
许你并不需要那么多的数据,而是只要cnName和enName这两列数据。那么也很简单,我们只要再增加一个连缀就行了,如下所示:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").find(DEST.class);
也许你还要数据按照添加的时间倒序排列,那么可以这样:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").find(DEST.class);
数据太多了,其实你只要前10行就行了,那么可以这样:
List<DEST> mDestList = DataSupport.select("cnName", "enName").where("parentId = ?", "1").order("updateTime desc").limit(10).find(DEST.class);
如果我们想进行分页展示,那么翻页了,怎么办?可以添加一个偏移量就好了,这样:
List<DEST> 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);
网友评论