Android SQLite轻量框架LitePal

简介

LitePal是一个开源的安卓库,允许程序员极其简单的操作SQLite数据库。甚至不用写一句SQL语句就能完成大多数SQLite数据库操作,包括创建去或者更新表,CRUD操作,聚合操作等等。

特点
  • 使用对象关系映射模型(ORM)。
  • 基本上0配置,仅仅需要一个配置文件。
  • 自动与表保持联动(创建、修改或者删除)。
  • 多数据库支持。
  • 对SQL语句进行封装。
  • 简洁的查询语句。
  • 同时支持原生API的使用。



一,配置




1. 导入库

下载jar文件点击进入选择合适的版本进行下载
或者
直接在gradle中引入依赖:

JAVA
   dependencies {
       compile 'org.litepal.android:core:1.5.1'
   }




2. 配置litepal.xml文件

创建assert文件夹(与res同级),在其中创建litepal.xml文件,在里面如下配置:

XML
   <?xml version="1.0" encoding="utf-8"?>
   <litepal>
       <!--
        定义数据库的名称,默认情况下需要添加后缀.db,如果没有添加litepal内部将会自动添加该后缀
       -->
       <dbname value="demo" />

       <!--
        定义数据库的版本,每次你想升级数据库的时候在此处进行版本号定义.通常当你修改了下面mapping中的model类后需要升级,版本号加一
       -->
       <version value="1" />

       <!--
        定义模型类(如同javabean)在mapping标签中,litepal将会为每个类创建一个表,表中的列将是类中声明为private的成员.例如:  
        <list>
            <mapping class="com.test.model.Reader" />
            <mapping class="com.test.model.Magazine" />
        </list>
       -->
       <list>
       </list>

       <!--
        定义数据库文件创建在内部存储还是外部存储,值为internal或者external
           默认为internal
           例如:
           <storage value="external" />
       -->
       <storage value="external" />
   </litepal>




3. 配置LitePalApplication

为了避免每次使用都需要传递Context变量,可以直接在AndroidManifest.xml文件中使用LitePalApplication.

XML
   <manifest>
       <application
           android:name="org.litepal.LitePalApplication"
           ...
       >
           ...
       </application>
   </manifest>

如果有自定义的Application,让它继承至LitePalApplication即可.然后需要Application的onCreate方法中初始化:

JAVA
   public class MyOwnApplication extends AnotherApplication {

       @Override
       public void onCreate() {
           super.onCreate();
           LitePal.initialize(this);
       }
       ...
   }




二,使用




1. 创建表

定义模型类,假如创建了一个Album类:

JAVA
   public class Album extends DataSupport {

       @Column(unique = true, defaultValue = "unknown")
       private String name;

       private float price;

       private byte[] cover;

       private List<Song> songs = new ArrayList<Song>();

       // generated getters and setters.
       ...
   }

然后在配置文件litepal.xml文件中配置:

XML
   <list>
       <mapping class="org.litepal.litepalsample.model.Album" />
   </list>

之后在你下次操作数据库时该表自动创建.你就假设该表已经存在,当你打开,插入数据等操作时litepal检测到表不存在将会自动创建.




2. 更新表

直接对模型类进行修改:

JAVA
   public class Album extends DataSupport {

       @Column(unique = true, defaultValue = "unknown")
       private String name;

       @Column(ignore = true)
       private float price;

       private byte[] cover;

       private Date releaseDate;

       private List<Song> songs = new ArrayList<Song>();

       // generated getters and setters.
       ...
   }

这里添加了一个releaseDate变量(字段),price变量(字段)注释为忽略.

然后在litepal.xml文件中更新版本号:

XML
   <!-- 假设之前版本号为1 -->
   <version value="2" ></version>

表将会在下次对数据库进行操作时更新,添加一个releaseDate字段,移除price字段.




3. 保存数据

继承自DataSupport的子类将会有save方法,调用即可保存数据到数据库:

JAVA
   Album album = new Album();
   album.setName("album");
   album.setPrice(10.99f);
   album.setCover(getCoverImageBytes());
   album.save();




4. 查询数据

查询单条数据根据id:

JAVA
   Album album = DataSupport.find(Album.class, id);

条件查询:

JAVA
   //注意问号
   List<Album> albums = DataSupport.where("name=?", "fantasy").order("price").find(Album.class);




5. 更新数据

查询到数据取得模型类的对象,调用set方法修改后调用save保存即可.

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




6. 删除数据

和查询数据用法类似.

根据id删除单条数据:

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

删除所有数据:

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




7. 异步操作

当操作的数据量过大时可能需要异步操作避免当前线程阻塞,litepal支持所有CRUD操作方法异步操作.(都有对应的async方法)

例如:

JAVA
   DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
       @Override
       public <T> void onFinish(List<T> t) {
           List<Song> allSongs = (List<Song>) t;
       }
   });

如果需要的话,调用listen方法添加该操作的监听器.




以上还是有不少是借鉴各位大神的网志作为参考!

这一次可要我晕了好久,总是丢三落四的。
总算是把这次的网志给补上了!
还是和往常一样,给大家推荐一首歌!

Clsr (Aash Mehta Flip)
最后还是祝大家酷酷的!不知道会不会有人赞我。。。罒ω罒