当前位置: 首页 > 工具软件 > SquiDB > 使用案例 >

Squidb使用总结

笪烨
2023-12-01

Squidb使用总结

Squidb

Squidb是一个第三方数据库操作库,优点在于建表和数据库升级时较为方便。其中Model在写时不是线程安全,在读时是线程安全。不是ORM。

配置

参照github上方法

建表

每个表需继承TableModel,通过注释方法可自动生成。如建立一个表名为“people”,继承TableModel的子类名为”Person”的表:

@TableModelSpec(className=”Person”,tableName=”people”)
public class PersonSpec{
@ColumnSpec(name=”fname”,defaultValue=””)
public String firstName;
public String lastName;
public int age;
}

新建的表中会自动生成一个主键名为”_id”;@ColumnSpec中方法使字段”firstName”改名为“fname”,默认值设为“”。

可定义的字段类型为:基本类型及其封装、String、byte[]

建好后的表中字段会自动生成get、set方法。

若想自定义主键可如下写,但主键不可自增:

@TableModelSpec(className=”Person”,tableName=”people”)
public class PersonSpec{
@PrimaryKey
long myId;
}

注意:表中的字段不可以为其它model的集合,但可在表的类中添加额外的方法:

@TableModelSpec(className=”Person”,tableName=”people”)
public class PersonSpec{
@ColumnSpec(name=”fname”,defaultValue=””)
public String firstName;
public String lastName;
public int age;

@ModelMethod
public static String getFullName(){
    return person.getFirstName()+” ”+person.getLastName();
}
}

定义Database

创建一个SquidDatabase的子集,并需要实现如下方法(建议使用单例模式):
String getName(); 数据库的名字
int getVersion(); 当前数据库版本
Table[] getTables(); 当数据库初始化时,返回需要被创建的表
void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion); 处理数据库升级(详见数据库升级)

增加

使用database的persist()方法:

Person new Person=new Person();
newPerson.setFirstName(“Sam”);
newPerson.setLastName(“Bosley”);
newPerson.setAge(26);
database.persist(newPerson);
long rowed=newPerson.getId(); 在调用persist()后,model会自动获得id,即_id字段

也可以使用persistWithOnConflict()方法自己定义冲突算法。
注意:如果model的id未设置,调用persist()方法会增加一个新行,但如果设置后已存在会进行替换。如果想要创建一行新数据,不管是否设置id,可以调用createNew(model),将会清除id,并插入一行新数据。

查询

可使用query()方法和fetch()方法
query() 返回所有结果:

Query votersQuery=Query.select(Person.PROPERTIES).where(Person.AGE.gte(18));
SquidCursor<User> voters=database.query(Person.class,votersQuery);
try{
    Person p = new Person();
    for(voters.moveToFirst();!voters.isAfterLast();voters.moveToNext()){   
        //或者使用while(voters.moveToNext())
        p.readPropertiesFromCursor(voters);
        Log.i(p.getName()+”can vote,he/she is”+p.getAge()+”years old”);
}finally{
    voters.close();
}
}

fetch() 返回指定条件结果:

long rowed=1;
Person person=database.fetch(Person.class,rowId);

fetchByCriterion() 返回第一个符合条件的对象:

String guid=”xyz1”;
User user=database.fetchByCriterion(User.class,User.GUID.eq(guid));

fetchByQuery() 返回第一个query的结果:

Query query=Query.select().orderBy(Person.LAST_NAME.asc());
Person person=database.fetchByQuery(Person.class,query);

使用fetch() 可以只得到所需要的字段数据:

long id=1;
Person person=database.fetch(Person.class,id,Person.FIRST_NAME,Person.LAST_NAME);
String fullName=person.getFirstName()+” ”+person.getLastName();

//int age=person.getAge();调用此方法会报错,因为并未读取此字段

修改

针对一条数据修改(model必须已有id):

public void incrementPersonAge(Person person){
person.setAge(person.getAge()+1);
database.persist(person);
}

一次修改多条符合条件的数据:

Person template=new Person();
template.setFirstName(“Samuel”);
database.update(Person.FIRST_NAME.eq(“Sam”),template);

删除

根据id进行删除:

long rowId=1;
database.delete(Person.class,rowId);

根据条件删除多条数据:

database.deleteWhere(Person.class,Person.FIRST_NAME.eq(“Sam”));

数据库升级

可使用的方法有(成功返回true,失败返回false):

  • tryCreateTable() & tryDropTable()
  • tryCreateView() & tryDropView()
  • tryAddColumn()
  • tryCreateIndex() & tryDropIndex()
  • tryExecStatement()
  • tryExecSql()

继承SquidDatabase,重写getVersion()和onUpgrade()方法
版本1:

public class MyDatabase extends SquidDatabase{
    @Override
    protected int getVersion(){
        return 1;
    }

    @Override
    protected boolean onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        //一般第一个版本不需要升级,直接返回true
        return true
    }

}

版本2:

public class MyDatabase extends SquidDatabase{
    @Override
    protected int getVersion(){
        return 2;
    }

    @Override
    protected boolean onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        switch(){
        case 1:
            tryAddColumn(User.BIRTHDAY);
        }
        return true;
    }

}

版本3:

public class MyDatabase extends SquidDatabase{
    @Override
    protected int getVersion(){
        return 3;
    }

    @Override
    protected boolean onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        switch(){
        case 1:
            tryAddColumn(User.BIRTHDAY);
        case 2:
            tryAddColumn(User.PROFILE_IMAGE_ID);
            tryCreateTable(ProfileImage.TABLE);
        }
        return true;
    }

}

onUpgrade()方法返回是否升级成功,若不确定,可返回try…方法的返回值。
若升级失败,会调用onError()、onMigrationFailed()方法。onError()方法仅仅是打印log,处理方法可在onMigrationFailed()中执行,比如调用recreate()方法删除数据库并打开一个新的。recreate()方法只在onUpgrade()和onMigrationFailed()中线程安全,若在其它地方多线程调用会导致崩溃。

 类似资料: