LitePal

LitePal

最新dependencies

compile 'org.litepal.android:core:1.6.0'

配置litepal.xml

在main目录下创建assets文件夹,在assets目录下创建litepal.xml 内容如下:

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

    <!--定义数据库名称。当你数据库的名字不是.db结尾,LitePal会自动加上后缀。-->
    <dbname value="DbName" />

    <!--数据库版本。每当对数据库中的表有所改动你就要升级你的数据库,把版本值+1 -->
    <version value="1" />
   
 <!--Lite将为每个类创建表。类中的成员变量将被映射到表中的列  -->
    <list>
        <mapping class="com.db.app.bean.Student" />
    </list>

    <!--
        Java是一种区分大小写的语言,而数据库是不区分大小写。
        定义的表和列的名称的时候。Lite默认会把所有类名和字段名变成小写.开发人员可以改变这种默认设置。
        "keep" :将保持类中定义的。
        "upper" :将把所有类名和字段名变成大写。
        "lower" :使用默认值。
        建议使用默认. -->
    <cases value="keep" ></cases>

    <!--
       定义.db文件存储的地方。
       "internal" 是指.db文件将存储在私有目录数据库文件夹下,没有人可以访问的内部存储。
       "external" 是指.db文件将存在外部sd卡下/sdcard/Android/date/<package name>/files/databases,每个人都可以访问不安全。
       默认值  "internal"。-->
    <storage value="external" />
</litepal>

初始化

由于操作数据库时需要用到Context,所以在自定义Application的oncreat()中初始化数据库LitePal.initialize(this)

创建表

/**
 * 存储已读未读的id
 */
data class NoticeId(var numId: Int) : DataSupport()

LitePal会在每个表中自动生成一个id列,毕竟每张表都一定要有主键的,所以当存储一些含有id的数据,并且要存储的id和自增的不一样的时候要谨慎,要把id存到另外的列中,比如numId等,总之自己创建的表(bean对象)尽量不要含有id.
现在只要你对数据库有任何的操作,NoticeId表就会被自动创建出来。比如说LitePal提供了一个便捷的方法来获取到SQLiteDatabase的实例,如下所示:

QLiteDatabase db = Connector.getDatabase();  

为了方便可以在LitePal.initialize(this)后面加上Connector.getDatabase() 这样就创建了数据库中的表

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        LitePal.initialize(this)
        Connector.getDatabase()
    }

升级数据

有段时间项目用到数据库存储一些数据,看了好多结果还是感觉郭神的LitePal最好用,下面是1.4.1版本的总结及用法
http://mp.weixin.qq.com/s/5FMsDWq7mj55iBxpLCNTwg

下面我将继续书写一下LitePal 1.5.0的一些更新的内容

1.异步操作数据库

Android官方是建议将所有的数据库操作都放在子线程中进行的。所以这一次支持异步操作数据库是LitePal 1.5.0版本的核心功能.

  • LitePal中所有的CRUD方法都加入了一个Async的副本方法。原来的有find()方法,现在多出一个findAsycn()方法,原来有save()方法,现在多出saveAsync()方法。如果想要进行异步数据库操作的时候,调用原API相对应的Async副本方法就可以了。
  • 由于是异步操作,那异步操作的结果就只能依靠回调来完成。所以,每一个Async副本方法的后面添加了一个listen()方法,专门用于监听异步操作的结果。
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.saveAsync().listen(new SaveCallback() {
    @Override
    public void onFinish(boolean success) {
    }
});

这里调用了findAll()方法的Async副本,也就是findAllAsyc()方法,并串接了一个listen()方法用于监听查询结果。需要注意的是,查询结果是使用泛型的方式回调到onFinish()方法中的,也就是说开发人员还需要自己做一次向下转型操作才行。回调到onFinish()方法之后都会切回到主线程.

2.不存在就存储,已存在就更新

LitePal 1.5.0版本中新增了一个saveOrUpdate()方法,专门用来处理这种不存在就存储,已存在就更新的需求。
使用saveOrUpdate()方法存储,有就更新 没有就存:

Person p = new Person();
p.setName("小明");
p.setAge(16);
p.saveOrUpdate("name=?", p.getName());

调用saveOrUpdate()方法后,LitePal内部会自动判断,如果表中已经存在小明这条记录了,就会自动更新,如果不存在的话,就会自动插入。

当然,这个新增的saveOrUpdate()方法也有它的Async副本。如果你想异步进行saveOrUpdate操作,那么只需要这样写就可以了:

Person p = new Person();
p.setName("小明");
p.setAge(16);
p.saveOrUpdateAsync("name=?", p.getName())
.listen(new SaveCallback() {
    @Override
    public void onFinish(boolean success) {
    }
});

好了,LitePal 1.5.0版本中最主要的两大新功能就介绍的差不多了

3.如何升级

升级方式一如既往的简单,如果你使用的是Android Studio,只需要在build.gradle中修改一下配置即可:

dependencies {
    compile 'org.litepal.android:core:1.5.0'
}

1.5.0版本中的所有的功能都是向下兼容的,因此你的升级不用付出任何成本。

kotlin存储对象

litepal.xml部分不变

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="HelloKotlin" />
    <version value="1" />
    <list>
        <mapping class="lqx.haha.com.hellokotlin.bean.Student" />
    </list>
    <storage value="external" />
</litepal>

创建一个kotlin数据bean并继承DataSupport,如果不想创建对象的时候都初始化一遍,直接在下面写成:(var name: String = "",var age: Int = 0)即可

data class Student(var name: String,var age: Int) : DataSupport()
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        //普通存储
        Student("张三", 27).save()
        val toJson = Gson().toJson(Student("王五", 78))
        //saveOrUpdate:没有就存储,有就直接覆盖
        Gson().fromJson(toJson, Student::class.java).saveOrUpdate("name=?", "王五")
    }
}

阅读原文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,988评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 相信我,当你用上 LitePal 之后,你将再也不想去碰 SQLiteDatabase 了。 LitePal是一款...
    七分小熊猫阅读 3,084评论 1 6
  • 因为从未找到一个人比我还爱自己 也未找到一个人让我比爱自己更爱他 故而 单身
    仅此一家的胡太太阅读 262评论 0 1
  • 窗外天不亮 小鸟儿又开始 一如既往的联欢演唱 叽叽喳喳 叽叽喳喳 你乱如麻的心事 因它们欢快地叫声 被抛向九霄云外...
    云水禅心ZLM阅读 165评论 4 4