LitePal for Android


LitePal是一个开源的Android库,使开发人员使用SQLite数据库非常简单。您无需编写任何SQL语句就可以完成大部分数据库操作,包括创建或升级表,增、删、改、查操作,合计函数等。LitePal的设置也很简单,您只许5分钟就可以将其集成到您的项目中。

现在就开始体验吧!

功能

  • 使用对象关系映射(ORM)模式。
  • 几乎零配置(仅有一个配置文件,属性值还非常少)。
  • 自动维护所有数据表(例如,创建,更改或删除表)。
  • 支持多数据库
  • 封装了多种API,是开发者避免了编写SQL语句的烦恼。
  • 超实用的查询API。
  • 您仍可以通过编写SQL语句进行操作,但封装好的API会更加方便快捷。
  • 更多功能,敬请期待。

最新版下载

快速配置

1. 导入库

使用 Eclipse
  • 在上面的部分下载最新的jar。 或浏览所有版本,选择一个下载。
  • 把jar文件放在您Android项目的libs目录下。
使用 Android Studio

编辑您的 build.gradle 文件,加入如下依赖:

  1. dependencies {
  2. compile 'org.litepal.android:core:1.5.1'
  3. }

2. 配置 litepal.xml

在您项目中创建“assets”目录,并在其中创建“litepal.xml”文件,将下方代码拷贝其中。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <litepal>
  3. <!--
  4. Define the database name of your application.
  5. By default each database name should be end with .db.
  6. If you didn't name your database end with .db,
  7. LitePal would plus the suffix automatically for you.
  8. For example:
  9. <dbname value="demo" />
  10. -->
  11. <dbname value="demo" />
  12.  
  13. <!--
  14. Define the version of your database. Each time you want
  15. to upgrade your database, the version tag would helps.
  16. Modify the models you defined in the mapping tag, and just
  17. make the version value plus one, the upgrade of database
  18. will be processed automatically without concern.
  19. For example:
  20. <version value="1" />
  21. -->
  22. <version value="1" />
  23.  
  24. <!--
  25. Define your models in the list with mapping tag, LitePal will
  26. create tables for each mapping class. The supported fields
  27. defined in models will be mapped into columns.
  28. For example:
  29. <list>
  30. <mapping class="com.test.model.Reader" />
  31. <mapping class="com.test.model.Magazine" />
  32. </list>
  33. -->
  34. <list>
  35. </list>
  36.  
  37. <!--
  38. Define where the .db file should be. "internal" means the .db file
  39. will be stored in the database folder of internal storage which no
  40. one can access. "external" means the .db file will be stored in the
  41. path to the directory on the primary external storage device where
  42. the application can place persistent files it owns which everyone
  43. can access. "internal" will act as default.
  44. For example:
  45. <storage value="external" />
  46. -->
  47.  
  48. </litepal>

这是唯一的配置文件,并且要配置的属性也非常简单。

  • dbname 配置该项目数据库名称
  • version 配置数据库版本号。每次您要更新库时,使其值加一。
  • list 配置映射类。
  • storage 配置数据库文件的存储位置。 值为“internal” 或 “external”。

3. 配置 LitePalApplication

你不详一直传递Context参数。 为了使API变得简单,只需在AnandManManestest.xml中配置LitePalApplication,如下所示:

  1. <manifest>
  2. <application
  3. android:name="org.litepal.LitePalApplication"
  4. ...
  5. >
  6. ...
  7. </application>
  8. </manifest>

当然,您可能已经在此配置好了您自己的应用程序,如:

  1. <manifest>
  2. <application
  3. android:name="com.example.MyOwnApplication"
  4. ...
  5. >
  6. ...
  7. </application>
  8. </manifest>

这没关系,LitePal也可以接受。 只要在您的程序中调用 LitePal.initialize(context) 即可:

  1. public class MyOwnApplication extends AnotherApplication {
  2.  
  3. @Override
  4. public void onCreate() {
  5. super.onCreate();
  6. LitePal.initialize(this);
  7. }
  8. ...
  9. }

确保尽可能早的调用这个方法。 最好在 onCreate() 方法中调用。并始终记住使用应用程序上下文作为参数。 不要使用任何活动或服务实例作为参数,否则可能会发生内存泄漏。

开始使用

配置成功后,您就可以使用这些功能强大的方法了。

1. 创建数据表

首先建立一个模型。例如您要建立两个模型Album和Song。可以按如下方式定义:

  1. public class Album extends DataSupport {
  2.  
  3. @Column(unique = true, defaultValue = "unknown")
  4. private String name;
  5.  
  6. private float price;
  7.  
  8. private byte[] cover;
  9.  
  10. private List<Song> songs = new ArrayList<Song>();
  11.  
  12. // generated getters and setters.
  13. ...
  14. }
  15. public class Song extends DataSupport {
  16.  
  17. @Column(nullable = false)
  18. private String name;
  19.  
  20. private int duration;
  21.  
  22. @Column(ignore = true)
  23. private String uselessField;
  24.  
  25. private Album album;
  26.  
  27. // generated getters and setters.
  28. ...
  29. }

然后将这些模型添加到litepal.xml映射列表中:

  1. <list>
  2. <mapping class="org.litepal.litepalsample.model.Album" />
  3. <mapping class="org.litepal.litepalsample.model.Song" />
  4. </list>

好的!数据表会在您下次操作数据库的时候自动创建。例如,使用以下代码获取SQLiteDatabase:

  1. SQLiteDatabase db = LitePal.getDatabase();

现在这些表会自动生成如下这样的SQL语句:

  1. CREATE TABLE album (
  2. id integer primary key autoincrement,
  3. name text unique default 'unknown',
  4. price real,
  5. cover blob
  6. );
  7.  
  8. CREATE TABLE song (
  9. id integer primary key autoincrement,
  10. name text not null,
  11. duration integer,
  12. album_id integer
  13. );

2. 更新数据表

使用LitePal更新数据表也非常的简单,只需要吧实例模型修改成您想要的数据就可以:

  1. public class Album extends DataSupport {
  2.  
  3. @Column(unique = true, defaultValue = "unknown")
  4. private String name;
  5.  
  6. @Column(ignore = true)
  7. private float price;
  8.  
  9. private byte[] cover;
  10.  
  11. private Date releaseDate;
  12.  
  13. private List<Song> songs = new ArrayList<Song>();
  14.  
  15. // generated getters and setters.
  16. ...
  17. }

已添加releaseDate 字段,并注释了price 字段。 然后增加litepal.xml中的版本号:

  1. <!--
  2. Define the version of your database. Each time you want
  3. to upgrade your database, the version tag would helps.
  4. Modify the models you defined in the mapping tag, and just
  5. make the version value plus one, the upgrade of database
  6. will be processed automatically without concern.
  7. For example:
  8. <version value="1" ></version>
  9. -->
  10. <version value="2" ></version>

数据表会在您下次操作数据库的时候自动更新。releasedate 列会被加入到 album 表中,并且 price 列将会被删除掉。album 表中除了被删除的列,其他的数据都依然存在。

但是,对于一些LitePal无法处理的升级条件,升级表中的所有数据将被清除:

  • 添加一个注释为unique = true的字段。
  • 将字段的注释更改为unique = true。
  • 将字段的注释更改为nullable = false。

注意上述导致数据丢失的情况。

3. 保存数据

保存数据的API是面向对象的。从DataSupport继承的每个模型都可以使用save()方法来保存数据:

  1. Album album = new Album();
  2. album.setName("album");
  3. album.setPrice(10.99f);
  4. album.setCover(getCoverImageBytes());
  5. album.save();
  6. Song song1 = new Song();
  7. song1.setName("song1");
  8. song1.setDuration(320);
  9. song1.setAlbum(album);
  10. song1.save();
  11. Song song2 = new Song();
  12. song2.setName("song2");
  13. song2.setDuration(356);
  14. song2.setAlbum(album);
  15. song2.save();

以上操作会将 album, song1 and song2 插入到数据库中并进行关联。

4. 更新数据

最简单的办法,就是先通过find()方法找到待更新的记录,并使用save()方法更新数据:

  1. Album albumToUpdate = DataSupport.find(Album.class, 1);
  2. albumToUpdate.setPrice(20.99f); // raise the price
  3. albumToUpdate.save();

任何一个集成 DataSupport 类的模块都有 update() 和 updateAll() 两个方法。您可以使用指定的ID更新单个记录:

  1. Album albumToUpdate = new Album();
  2. albumToUpdate.setPrice(20.99f); // raise the price
  3. albumToUpdate.update(id);

或者您也可以通过where条件来更新多条记录:

  1. Album albumToUpdate = new Album();
  2. albumToUpdate.setPrice(20.99f); // raise the price
  3. albumToUpdate.updateAll("name = ?", "album");

5. 删除数据

您可以使用DataSupport类中delete()这个静态方法来删除单条记录:

  1. DataSupport.delete(Song.class, id);

或者使用 deleteAll() 删除多条记录:

  1. DataSupport.deleteAll(Song.class, "duration > ?" , "350");

6. 查询数据

通过指定ID查询单条记录:

  1. Song song = DataSupport.find(Song.class, id);

查询某一表中的所有记录:

  1. List<Song> allSongs = DataSupport.findAll(Song.class);

使用API构建复杂查询:

  1. List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);

7. 异步操作

默认情况下,每个数据库操作都在主线程上。如果您的操作可能花费很长时间,例如保存或查询大量记录。 您可能需要使用异步操作。

LitePal支持所有增、删、改、查方法的异步操作。如果要从后台线程的song表中查找所有记录,请使用如下代码:

  1. DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
  2. @Override
  3. public <T> void onFinish(List<T> t) {
  4. List<Song> allSongs = (List<Song>) t;
  5. }
  6. });

只需使用 findAllAsync() 代替 findAll(), 并附加一个listen()方法,操作一旦完成,查找结果将回调到onFinish()方法。

Abd异步保存是完全相同的:

  1. Album album = new Album();
  2. album.setName("album");
  3. album.setPrice(10.99f);
  4. album.setCover(getCoverImageBytes());
  5. album.saveAsync().listen(new SaveCallback() {
  6. @Override
  7. public void onFinish(boolean success) {
  8.  
  9. }
  10. });

只需使用saveAsync()替代save()。它会将Album异步保存到数据库中,保存结果将回调到onFinish()方法。

8. 多数据库

如果您的应用需要多个数据库,LitePal完全支持它。 您可以在运行时创建任意数量的数据库。 例如:

  1. LitePalDB litePalDB = new LitePalDB("demo2", 1);
  2. litePalDB.addClassName(Singer.class.getName());
  3. litePalDB.addClassName(Album.class.getName());
  4. litePalDB.addClassName(Song.class.getName());
  5. LitePal.use(litePalDB);

这将创建一个具有singer,album和song表的demo2数据库。

如果您只想创建一个与litepal.xml配置相同新的数据库,您可以使用以下命令:

  1. LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
  2. LitePal.use(litePalDB);

您可以随时切换回默认数据库:

  1. LitePal.useDefault();

您可以通过指定的数据库名称删除任何数据库:

  1. LitePal.deleteDatabase("newdb");

LitePal——Android数据库框架完整使用手册的更多相关文章

  1. Android 数据库框架总结(转)

    转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...

  2. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

  3. Android 数据库框架OrmLite的使用(一)

    在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...

  4. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  5. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  6. Android 数据库框架ormlite

    Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机 ...

  7. Android数据库框架-----ORMLite关联表的使用

    上一篇已经对ORMLite框架做了简单的介绍:Android数据库框架-----ORMLite 的基本用法~~本篇将介绍项目可能会使用到的一些用法,也为我们的使用ORMLite框架总结出一个较合理的用 ...

  8. Android数据库框架-----ORMLite 的基本用法

    ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...

  9. DBExecutor android 数据库框架

    https://github.com/eltld/DBExecutor android 数据库框架,sqlite database

随机推荐

  1. mysql数据库表字段使用DESC等关键字报错及解决方法

    <!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...

  2. 【转】nagios使用带url的check_http检测主机

    前一段时间在Cu论坛发现一个提问,问题是nagios关于检测主机http服务的.原帖地址http://bbs.chinaunix.net /forum.php?mod=viewthread&t ...

  3. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  4. php之冒泡排序

    <?php//冒泡排序function shell_sort($arr){for($i=0;$i<count($arr)-1;$i++){for($j=0; $j< count($a ...

  5. 使用mybatis从mysql里进行模糊查询的编码问题

    关于这个问题,记录下我的解决方法,希望对有同样困惑的朋友,有所帮助. 问题描述: 我在做mybatis从mysql里模糊查询时,如果模糊的关键词是字母的话,可以查出来.如果模糊的关键词是汉字的话,查不 ...

  6. 初识Python装饰器

    python中,一切皆对象.做为面向对象开发中非常重要的一个环节,函数有着无可替代的作用. 函数可以作为对象赋值给一个变量,可以作为元素添加到集合对象中,可以作为参数值传递给其它函数,还可以当做函数的 ...

  7. BZOJ 3512: DZY Loves Math IV [杜教筛]

    3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...

  8. BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]

    题意: 有$n \le 10^6$中物品,每种两个权值$\le 10^4$只能选一个,使得选出的所有权值从1递增,最大递增到多少 一开始想了一个奇怪的规定流量网络流+二分答案做法...然而我还不知道怎 ...

  9. ES6,Array.includes()函数的用法

    在ES5,Array已经提供了indexOf用来查找某个元素的位置,如果不存在就返回-1,但是这个函数在判断数组是否包含某个元素时有两个小不足,第一个是它会返回-1和元素的位置来表示是否包含,在定位方 ...

  10. asp.net core 中 sql server 2017 数据库连接测试

    使用sql server 2017 进行连接: 配置appsettings.json文件 { "ConnectionStrings": { "DefaultConnect ...