LitePal 使用说明

作者: 雨林雨林 | 来源:发表于2017-03-09 17:21 被阅读2146次

    LitePal

    Android开源数据库框架

    资料

    Github

    设置

    导入

    • 配置模组的 build.gradle
    compile 'org.litepal.android:core:1.5.0'
    

    配置

    • assets 目录创建 litepal.xml
    <?xml version="1.0" encoding="utf-8"?>
    <litepal>
        <dbname value="demo" />
        <version value="1" />
        <list>
          <mapping class="com.test.model.Reader" />
          <mapping class="com.test.model.Magazine" />
        </list>
        <storage value="external" />
    </litepal>
    
    • dbname 定义数据库名。默认以 .db 结尾,如未以此结尾,则自动添加。
    • version 定义数据库版本。辅助升级数据库。
    • list 根据标签 mapping 对应的类创建表,成员变量对应字段。
    • storage 定义数据库文件存储的地方,可选 internal 和 external, 默认为 internal

    初始化

    • 在自定义的Application中初始化
    LitePal.initialize(this);
    
    • 或者使用LitePal库的Application
    <manifest>
        <application
            android:name="org.litepal.LitePalApplication"
            ...
        >
        ...
        </application>
    </manifest>
    

    基本用法

    建表

    • 定义 Bean,继承 DataSupport
    • id字段可写可不写,默认自动产生
    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>(); // 关系:对多
    
        // getters/setters
    }
    
    public class Song extends DataSupport {
    
        @Column(nullable = false) // 非空
        private String name;
    
        private int duration;
    
        @Column(ignore = true)  // 忽略
        private String uselessField;
    
        private Album album; // 关系:对一
    
        // getters/setters
    }
    
    • 修改 litepal.xml
    <list>
        <mapping class="org.litepal.litepalsample.model.Album" />
        <mapping class="org.litepal.litepalsample.model.Song" />
    </list>
    
    • 获取数据库
    SQLiteDatabase db = LitePal.getDatabase();
    
    • 对应的SQL语句
    CREATE TABLE album (
        id integer primary key autoincrement,
        name text unique default 'unknown',
        price real,
        cover blob
    );
    
    CREATE TABLE song (
        id integer primary key autoincrement,
        name text not null,
        duration integer,
        album_id integer
    );
    

    关系

    • 定义Bean时定义成员变量,即在建表时自动创建外键
    • 对一,成员变量为另一个Bean
    • 对多,成员变量为另一个Bean的集合
    • 多对多,两个Bean互相定义成员变量为另一Bean的集合
    • 数据表删除操作时,自动按外键进行删除

    升级

    • 修改 Bean
    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>();
    
        // getters/setters
    }
    
    • 修改 litepal.xml

    版本号增加,数据自动保存

    <version value="2" />
    
    • 丢失数据状况
      • 注解成员变量unique = true
      • 改变注解unique = true
      • 改变注解nullable = false

    增加

    • DataSupport:saveAll
    • Bean:save/saveThrows/saveOrUpdate
    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();
    

    修改

    • DataSupport:update/updateAll
    • Bean:update/updateAll/setToDefault/assignBaseObjId
    Album albumToUpdate = DataSupport.find(Album.class, 1); //查找
    albumToUpdate.setPrice(20.99f);
    albumToUpdate.save(); // 保存
    
    Album albumToUpdate = new Album();
    albumToUpdate.setPrice(20.99f);
    albumToUpdate.update(id); // 更新
    
    Album albumToUpdate = new Album();
    albumToUpdate.setPrice(20.99f);
    albumToUpdate.updateAll("name = ?", "album"); // 更新所有
    
    Album albumToUpdate = new Album();
    albumToUpdate.setToDefault("name"); // 更新为默认值
    albumToUpdate.updateAll();
    

    删除

    • DataSupport:delete/deleteAll/markAsDeleted
    • Bean:delete/clearSavedState
    • Bean必须是已持久化的对象,否则无效
    DataSupport.delete(Song.class, id); // 删除
    DataSupport.delete(Song.class); // 删除所有数据
    DataSupport.deleteAll(Song.class, "duration > ?" , "350"); // 条件删除
    

    查询

    • DataSupport:find/findFirst/findLast/findAll/findBySQL/isExist
    • DataSupport:select/where/order/limit/offset 查询条件
    • Bean:isSaved
    Song song = DataSupport.find(Song.class, id);
    Song song = DataSupport.findFirst(Song.class); // 查询第一条
    Song song = DataSupport.findLast(Song.class); // 查询最后一条
    
    List<Song> allSongs = DataSupport.findAll(Song.class);
    List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").find(Song.class);
    List<Song> songs = DataSupport.where("name like ?", "song%").order("duration").limit(3).offset(1).find(Song.class); // 分页查询
    
     // 联合查询,可以查询关联表
    Album album = DataSupport.find(Album.class, id, true);
    List<Song> songs = album.getSongs();
    

    异步

    • 大部分方法都有对应的异步方法
    // 查询
    DataSupport.findAllAsync(Song.class).listen(new FindMultiCallback() {
        @Override
        public <T> void onFinish(List<T> t) {
            List<Song> allSongs = (List<Song>) t;
        }
    });
    
    // 增加
    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) {
    
        }
    });
    

    聚合函数

    count/average/max/min/sum

    int result = DataSupport.count(Song.class);
    int result = DataSupport.where("name like ?", "song%").count(Song.class);
    
    double result = DataSupport.sum(Album.class, "price", double.class);
    

    多库

    LitePalDB litePalDB = new LitePalDB("demo2", 1);
    litePalDB.addClassName(Singer.class.getName());
    litePalDB.addClassName(Album.class.getName());
    litePalDB.addClassName(Song.class.getName());
    LitePal.use(litePalDB); // 建库
    
    LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
    LitePal.use(litePalDB); // 使用 litepal.xml 创建一个新库
    
    LitePal.useDefault(); // 返回默认库
    
    LitePal.deleteDatabase("newdb"); // 删库
    

    相关文章

      网友评论

      • w_不放弃:您好,请问如何指定数据库的路径呢

      本文标题:LitePal 使用说明

      本文链接:https://www.haomeiwen.com/subject/mqewgttx.html