Android数据库框架DBFlow基本运用

Github地址

DBFlow的github地址

配置 DBFlow

				allprojects {
    
    
				    repositories {
    
    
				        jcenter()
				        maven {
    
     url "https://jitpack.io" }
				    }
				}

然后,在 Module 对应的 build.gradle 文件中添加依赖,具体如下:

				//为了方便可使用 def 关键字定义版本号
				def dbFlow_version = "4.2.4"
				dependencies {
    
    
				    //...
				    annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:${dbFlow_version}"
				    compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbFlow_version}"
				    compile "com.github.Raizlabs.DBFlow:dbflow:${dbFlow_version}"
				}

上面代码中的依赖只是针对于 Java,如果你要使用 Kotlin、RxJava 等要配置相对应的依赖即可。

注意:升级新版本的 DBFlow 时,一定要删除旧版本的依赖,因为新旧版本的注解处理器可能不同,如果未移除旧版本,将会报如下错误,具体如下:

java.lang.NoSuchMethodError: com.raizlabs.android.dbflow.annotation.Table.tableName()Ljava/lang/String

然后,自定义 Application ,在相应的 onCreate() 方法中初始化 DBFlow,具体如下:

				/**
				 * 自定义Application
				 */
				public class MyApplication extends Application{
    
    
				    @Override
				    public void onCreate() {
    
    
				        super.onCreate();
				        //初始化DBFlow
				        FlowManager.init(new FlowConfig.Builder(this).build());
				        //设置日志显示
				        FlowLog.setMinimumLoggingLevel(FlowLog.Level.V);
				    }
				}

最后,在 AndroidManifest.xml 文件中使用自定义的 Application,具体如下:

				<application
				    android:name=".MyApplication"
				</application>

创建数据库

创建一个类并使用 @Database 注解来定义自己的数据库,该类应该要定义数据库的名称和数据库的版本,具体如下:

				/**
				 * MyDatabase
				 */
				@Database(name = MyDatabase.NAME, version = MyDatabase.VERSION)
				public class MyDatabase {
    
    
				    //数据库名称
				    public static final String NAME = "MyDatabase";
				    //数据库版本号
				    public static final int VERSION = 1;
				}

注意:如果以后要修改任意表的结构,为避免与旧版本数据库冲突一定要修改版本号,且保证版本号只升不降。

创建表

在已经创建好数据库的前提下就可以创建表了,表的模型类一般需要继承 BaseModel,并为模型类中的每个字段添加 @Column 注解,该注解将映射模型类的字段到对应表中的列,定义一张表具体如下:

@Table(database = MyDatabase.class)
public class NoteTable extends BaseModel {
    
    
    @Column
    @PrimaryKey
   	public int id;
    @Column
    public String title;
    @Column
    public String date;
    @Column
    public String content;

}

注意:在一张表中至少必须定义一个字段作为主键(primary key),如果模型类中某个字段是私有的,一定要定义相应的 getter、setter 方法,否则会在创建表的环节失败,表的命名要使用驼峰命名法,否则可能会出现如此下问题:

java.lang.IllegalArgumentException: expected type but was null

创建完成后,需要编译一下,点击编译按钮,或者Build->Make Project即可,它会自动生成一些数据库文件,也会提示你创建是否有误!

插入数据

使用 DBFlow 插入数据常用的有二种方式,具体如下:

1.model.insert()
2.SQLite.insert()
前者用于单个模型类对象的的插入,创建完具体的对象后,调用 model.insert() 即可插入该对象所对应的记录;后者使用 SQLite Wrapper Language 来插入数据,类似于原生的 insert 语句,支持多列数据的插入,使用起来比较方便,具体如下:

/**
 * 插入数据
 */
public void inseartData(NoteBean model){
    
    
    //1.model,insert()
    model.setTitle("西甲");
    model.setDate("2018-10-10");
    model.setContent("皇马VS巴萨");
    model.insert();
    //2.SQLite.insert()
    SQLite.insert(NoteBean.class)
            .columns(NoteBean_Table.title,NoteBean_Table.date,NoteBean_Table.content)
            .values("欧冠","2018-06-17","皇马Vs利物浦")
            .execute();
}

删除数据

使用 DBFlow 删除数据常用的有二种方式,具体如下:

1.model.delete():删除某条记录
2.SQLite.delete():根据条件删除

前者用于单个模型类对象的的删除,创建完具体的对象后,调用 model.delete() 即可删除该对象所对应的记录;后者使用 SQLite Wrapper Language 来条件删除数据,类似于原生的 delete 语句,使用起来比较方便,具体如下:

/**
 * 删除数据
 */
public void deleteData(NoteBean model){
    
    
    //1.model.delete()
    model.delete();
    //2.SQLite.delete()
    SQLite.delete(NoteBean.class)
            .where(NoteBean_Table.title.is("西甲"))
            .and(NoteBean_Table.id.is(1))
            .async()
            .execute();
    //删除整张表
    Delete.table(NoteBean.class);
    //删除多张表
    Delete.table(NoteBean.class,NoteBean1.class);
}

更新数据

使用 DBFlow 删除数据常用的有二种方式,具体如下:

1.model.update():更新某条记录
2.SQLite.update():根据条件更新某条记录

前者用于单个模型类对象的的更新,创建完具体的对象后,调用 model.update() 即可更新该对象所对应的记录;后者使用 SQLite Wrapper Language 来条件删除数据,类似于原生的 update 语句,使用起来比较方便,具体如下:

/**
 * 更新数据
 */
public void updateData(NoteBean model) {
    
    
    //1.model.update()
    model.update();
    //2.SQLite.update()
    SQLite.update(NoteBean.class)
            .set(NoteBean_Table.title.eq("西甲"),
                    NoteBean_Table.content.eq("皇马"))
            .where(NoteBean_Table.id.is(1))
            .async()
            .execute();
}

查询数据

查询使用 SQLite.select() 方法,具体参考如下:

/**
 * 查询数据
 */
public List<NoteBean> queryData(){
    
    
    //根据条件查询
    List<NoteBean> noteBeans = SQLite.select()
            .from(NoteBean.class)
            .where(NoteBean_Table.title.is("title"))
            .queryList();
    return noteBeans;
}

注意:对于插入、更新操作可以使用 model.save() 方法
复杂组合的条件查询,具体参考如下:

OperatorGroup op = OperatorGroup.clause
        (
                RegisterUserModel_Table.mobile.eq(mobile)//这是一个条件
        )
        .and(
                //这是一个条件
                OperatorGroup.clause()
                        .or(RegisterUserModel_Table.identity.eq(RegisterUserModel.USER_IDENTIFY_BODY))
                        .or(RegisterUserModel_Table.identity.eq(RegisterUserModel.USER_IDENTIFY_GIRL))
        );
List<RegisterUserModel> list = SQLite.select().from(RegisterUserModel.class)
        .where(op) //执行的时候的查询的条件
        .queryList();

like条件的查询,具体参考如下:

    public static List<String> getAppPackageLikeName(String name) {
    
    
        OperatorGroup op = OperatorGroup.clause()
                //字段值以name名开头的条件
                .or(AppItem_Table.appName.like(TextUtils.concat(name, "%").toString()))
                //字段值以name名结尾的条件
                .or(AppItem_Table.appName.like(TextUtils.concat("%", name).toString()))
                //字段值以name名处在中间的条件
                .or(AppItem_Table.appName.like(TextUtils.concat("%", name, "%").toString()));
        List<AppItem> list = SQLite.select().from(AppItem.class)
                .where(op).queryList();
        return strList;
    }

以上就是关于Dbflow的使用。

猜你喜欢

转载自blog.csdn.net/eyishion/article/details/100517383