android DBFlow

隨意翻了一下android數據庫框架,找到這個,個人感覺是封裝性高,但是如果要執行原生SQL,沒有進行單獨封裝,不太方便,值得吐槽的是,使用SQLite.insert(XX.class)這種格式,連官方說明中都沒有給出用法,不解,經測試,找出,後面會補。官方api:https://agrosner.gitbooks.io/dbflow/content/?q=
中文版api:https://yumenokanata.gitbooks.io/dbflow-tutorials/content/index.html

導入

project build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
    }

    repositories {
        maven { url "https://jitpack.io" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

module build.gradle

def dbflow_version = "3.0.0-beta2"
dependencies{
    apt "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}"

    // sql-cipher database encyrption (optional)
    compile "com.github.Raizlabs.DBFlow:dbflow-sqlcipher:${dbflow_version}"
}

增刪改查

自定數據庫名稱版本:

@Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION)
public class DBFlowDatabase {
    //數據庫名稱
    public static final String NAME = "DBFlowDatabase";
    //數據庫版本號
    public static final int VERSION = 1;
}

model:

@ModelContainer
@Table(database = DBFlowDatabase.class)
public class UserModel extends BaseModel {
    //自增ID
    @Column
    @PrimaryKey(autoincrement = true)
    public Long id;
    @Column
    public String name;
    @Column
    public int sex;
}

增刪改查:

public class DBFlowActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dbflow);
    }

    public void add(View view) {
        SQLite.insert(UserModel.class)      .columns(UserModel_Table.name.getNameAlias().getName(),UserModel_Table.sex.getNameAlias().getName())
                .columnValues(UserModel_Table.name.eq("測試1"),UserModel_Table.sex.eq(2))
                .execute();

    }

    public void delete(View view) {
        SQLite.delete(UserModel.class)
                .where(UserModel_Table.name.is("測試"))
                .query();
    }

    public void update(View view) {
         SQLite.update(UserModel.class)
                .set(UserModel_Table.name.eq("測試1"))
                .where(UserModel_Table.sex.is(1))
                 .execute();
    }

    public void select(View view) {
        List<UserModel> items =  SQLite.select().from(UserModel.class).queryList();
        Toast.makeText(this, new Gson().toJson(items), Toast.LENGTH_SHORT).show();
    }
}

數據庫升級

改版本

@Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION)
public class DBFlowDatabase {
    //數據庫名稱
    public static final String NAME = "DBFlowDatabase";
    //數據庫版本號
    public static final int VERSION = 2;
}

改表結構

@ModelContainer
@Table(database = DBFlowDatabase.class)
public class UserModel extends BaseModel {
    //自增ID
    @Column
    @PrimaryKey(autoincrement = true)
    public Long id;
    @Column
    public String name;
    @Column
    public int sex;
     @Column
    public int age;
}

DBFlowDatabase增加內部類:

@Database(name = DBFlowDatabase.NAME, version = DBFlowDatabase.VERSION)
public class DBFlowDatabase {
    //數據庫名稱
    public static final String NAME = "DBFlowDatabase";
    //數據庫版本號
    public static final int VERSION = 2;

    //出現需要包含xx的封閉實例時使用靜態內部類
    @Migration(version = 2, database = DBFlowDatabase.class)
    public static class Migration1 extends AlterTableMigration<UserModel> {
        //出現需要包含xx的封閉實例時使用此構造
        public Migration1(){
            super(UserModel.class);
        }

        public Migration1(Class<UserModel> table) {
            super(table);
        }

        @Override
        public void onPreMigrate() {
            // Simple ALTER TABLE migration wraps the statements into a nice builder notation
            addColumn(SQLiteType.INTEGER, UserModel_Table.age.getNameAlias().getName());
        }
    }
}

這個升級方法真的n級別吐槽,以1升到2爲例,有三個表就要寫三個內部類,2到3改3個表又要寫3個內部類,這方式還不如原本的方式呢,不如原本的if…else結構簡潔。
另外,比較要命的是,此數據庫框架對sqlcipher的支持現在無效了,api的都沒法用:
初始化要寫成這樣:

public class SQLCipherHelperImpl extends SQLCipherOpenHelper {

  public SQLCipherHelperImpl(BaseDatabaseDefinition databaseDefinition, DatabaseHelperListener listener) {
    super(databaseDefinition, listener);
  }

  @Override
  protected String getCipherSecret() {
    return "sesese";
  }
}
FlowManager.init(FlowConfig.builder(context)
                .addDatabaseConfig(
                        DatabaseConfig.builder(CipherDatabase.class)
                                .openHelper(new DatabaseConfig.OpenHelperCreator() {
                                    @Override
                                    public OpenHelper createHelper(DatabaseDefinition databaseDefinition, DatabaseHelperListener helperListener) {
                                        return new SQLCipherHelperImpl(databaseDefinition, helperListener);
                                    }
                                })
                                .build())
                .build());

然而找不到類FlowConfig,官網把cipher相關的屏蔽掉了,再研究。

發佈了155 篇原創文章 · 獲贊 33 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章