初識ObjectBox--Android平臺

官網:https://objectbox.io/java

github:https://github.com/objectboxandroid

介紹:ObjectBox是一個超快的面向對象數據庫,專爲物聯網和移動設備而構建。咱們爲小型設備提供邊緣計算,容許在本地存儲和處理數據,以實現高效,快速和安全的數據管理。ObjectBox小於1MB,所以它是移動應用程序,小型物聯網設備和物聯網網關的理想解決方案。咱們是第一個高性能的NoSQL,符合ACID的設備邊緣數據庫。咱們全部的產品都是在開發人員的基礎上構建的,所以它們易於使用而且須要最少的代碼來實現。c++

支持語言:java,c/c++,go,swift,kotlingit

基本涵蓋了全部平臺github

此文主要供 Java使用ObjectBox數據庫

kotlin版本:https://docs.objectbox.io/kotlin-supportswift

 

環境搭建:緩存

1.安全

目前最新版本:2.3.3 (2019/3/9)app

2,在app.build中添加插件

apply plugin: 'io.objectbox'

3.初始化ObjectBox(通常建議在Appliction初始化),在初始化以前咱們先要創建ObjectBox所需的實體類(這是個坑,不創建則沒辦法初始化)

 

4.創建實體類

//序列化實體類 Entity必加
@Entity
public class LoginBean {

    //id字段是必要的字段,不可忽略,不可用修飾符修飾
    @Id
    long uid;

    //索引,查詢大量數據可加快查詢速度
    @Index
    String loginName;

    //存儲數據 可看作表字段
    String passWord;


    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

 

添加完實體類 build下程序,ObjectBox生成初始化所須要的類

 

5.初始化ObjectBox

public class ObjectBox {

    private static BoxStore boxStore;

    public static void init(Context context){

        boxStore = MyObjectBox.builder().androidContext(context).build();
    }

    public static BoxStore getBoxStore() {
        return boxStore;
    }

}

 

public class MyApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        ObjectBox.init(this);
    }

}

6.添加/更新數據(若是當前添加的數據存在則更新數據,不然就添加)

box.put(object);

7.刪除/刪除全部數據

box.remove(object);
box.removeAll();

8.簡單的條件查詢

box.get(long id);

9.查詢全部數據

box.getAll();

10:工具類

public class ObjectBoxUtils {



    /**
     * 添加數據
     * */
    public static <T> void addData(Object o, Class c){

        Box<T> box= ObjectBox.getBoxStore().boxFor(c);


        box.put((T) o);

    }


    /***
     * 獲取指定查詢數據
     * */
    public static <T> T getConditionsData(Class clazz,String key){

        Field[] fs = clazz.getDeclaredFields();

        for (int i = 0; i < fs.length; i++){
            Field f = fs[i];
            f.setAccessible(true);

            if (f.getName().endsWith(key)) {
                try {
                    long id = (long) f.get(clazz);
                    Box<T> box= ObjectBox.getBoxStore().boxFor(clazz);
                    return box.get(id);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }


        return null;

    }


    public static  <T> List<T> getAllData(Class clazz){

        Box<T> box= ObjectBox.getBoxStore().boxFor(clazz);

        return box.getAll();
    }



    //刪除數據
    public static <T> void deleteData(Object o,Class clazz){

        Box <T> box= ObjectBox.getBoxStore().boxFor(clazz);

        box.remove((T) o);

    }


    /**
     * 刪除數據
     * */
    public static <T>  void removeAllData(Class clazz){

        Box <T> box= ObjectBox.getBoxStore().boxFor(clazz);
        box.removeAll();
    }



}

 

 

/**
 *  @ProjectName:
 * @Package:        com.hundsun.zjfae.common.user
 * @ClassName:      CacheData
 * @Description:     獲取APP緩存數據
 * @Author:         moran
 * @CreateDate:     2019/8/12 16:18
 * @UpdateUser:     更新者:
 * @UpdateDate:     2019/8/12 16:18
 * @UpdateRemark:   更新說明:
 * @Version:        1.0
 */
public class CacheData {

    private static CacheData cacheData;


    public static CacheData getInstance() {
        if (cacheData == null){
            synchronized (CacheData.class){
                cacheData = new CacheData();
            }
        }
        return cacheData;
    }

    private CacheData(){

    }


    public <T> List<T> getListCacheData(Class<T> tClass){
        List<T> list = new ArrayList<>();
        Box<T> box = ObjectBox.getBoxStore().boxFor(tClass);
        list.addAll(box.query().build().find());
        return list;
    }


    public <T> T getCacheData(Class<T> tClass){
        Box<T> box = ObjectBox.getBoxStore().boxFor(tClass);
        return box.query().build().findFirst();
    }


    /**
     *多條件查詢
     * @param tClass 查詢對象
     * @param propertyObjectMap 查詢條件集合 key查詢條件,value具體值
     * **/
    public <T> List<T> getListEqualCacheData(Class<T > tClass, Map<Property,Object> propertyObjectMap){

        if (propertyObjectMap == null){
            throw new NullPointerException("propertyObjectMap is not null and value is not null.");
        }

        if (propertyObjectMap.isEmpty()){

            throw  new IllegalStateException("propertyObjectMap is not empty and value is not empty.");
        }
        List<T> list = new ArrayList<>();
        Box<T> box = ObjectBox.getBoxStore().boxFor(tClass);
        QueryBuilder queryBuilder = box.query();
        Iterator<Map.Entry<Property,Object>> iterator = propertyObjectMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<Property,Object> entry = iterator.next();
            queryBuilder.equal(entry.getKey(),entry.getValue().toString());
        }

        list.addAll(queryBuilder.build().find());
        return list;
    }



    /**
     *多條件模糊查找
     * @param tClass 查詢對象
     * @param propertyObjectMap 查詢條件集合 key查詢條件,value具體值
     * **/
    public <T> List<T> getListContainsCacheData(Class<T > tClass, Map<Property,Object> propertyObjectMap){

        if (propertyObjectMap == null){
            throw new NullPointerException("propertyObjectMap is not null and value is not null.");
        }

        if (propertyObjectMap.isEmpty() ){

            throw  new IllegalStateException("propertyObjectMap is not empty and value is not empty.");
        }

        List<T> list = new ArrayList<>();
        Box<T> box = ObjectBox.getBoxStore().boxFor(tClass);

        QueryBuilder queryBuilder = box.query();
        Iterator<Map.Entry<Property,Object>> iterator = propertyObjectMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<Property,Object> entry = iterator.next();
            queryBuilder.contains(entry.getKey(),entry.getValue().toString());
        }

        list.addAll(queryBuilder.build().find());
        return list;
    }





    public <T> void putData(Class<T> clazz,Object value){
        Box<T> box = ObjectBox.getBoxStore().boxFor(clazz);
        box.put((T)value);

    }


    public <T> void deleteData(Class<T> clazz,Object value){
        Box<T> box = ObjectBox.getBoxStore().boxFor(clazz);
        box.remove((T) value);
    }


    public <T> void deleteAllData(Class<T> clazz){
        Box<T> box = ObjectBox.getBoxStore().boxFor(clazz);
        box.removeAll();
    }


}
注:QueryBuilder包含多種查詢語句API

 

 

 

11簡單的一個demo

Activity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText loginName,passWord;
    private TextView content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.login).setOnClickListener(this);
        //獲取全部數據
        findViewById(R.id.getAll).setOnClickListener(this);
        //更新數據
        findViewById(R.id.update).setOnClickListener(this);
        //刪除數據
        findViewById(R.id.delete).setOnClickListener(this);
        //刪除全部數據
        findViewById(R.id.deleteAll).setOnClickListener(this);
        content = findViewById(R.id.content);
        loginName = findViewById(R.id.loginName);
        passWord = findViewById(R.id.passWord);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login:
                if (TextUtils.isEmpty(loginName.getText().toString())){
                    Toast.makeText(this, "請輸入用戶名", Toast.LENGTH_SHORT).show();
                }
                else if (TextUtils.isEmpty(passWord.getText().toString())){
                    Toast.makeText(this, "請輸入密碼", Toast.LENGTH_SHORT).show();
                }
                else {

                    LoginBean loginBean = new LoginBean();
                    loginBean.setLoginName(loginName.getText().toString());
                    loginBean.setPassWord(passWord.getText().toString());
                    ObjectBoxUtils.addData(loginBean,LoginBean.class);
                    Toast.makeText(this, "登陸成功", Toast.LENGTH_SHORT).show();
                }

                break;

            case R.id.getAll:
                getLoginInfo();
                break;

            case R.id.update:
                LoginBean loginBean = new LoginBean();
                loginBean.uid = 1;
                loginBean.setLoginName("張三");
                loginBean.setPassWord("1234qwer");
                upData(loginBean);
                break;

            case R.id.delete:
                LoginBean delete = new LoginBean();
                delete.uid = 1;
                ObjectBoxUtils.deleteData(delete,LoginBean.class);
                break;
            case R.id.deleteAll:
                ObjectBoxUtils.removeAllData(LoginBean.class);
                break;
        }
    }

    private void getLoginInfo(){
        List<LoginBean> beanList = ObjectBoxUtils.getAllData(LoginBean.class);
        StringBuffer buffer = new StringBuffer();
        if (!beanList.isEmpty()){
            for (LoginBean loginBean : beanList){

                buffer.append("loginName:").append(loginBean.getLoginName()).append("\n");
                buffer.append("password:").append(loginBean.getPassWord()).append("\n");

                Log.e("uid",loginBean.uid +"");
                Log.e("loginName",loginBean.getLoginName());

                Log.e("password",loginBean.getPassWord());
            }

        }
        else {
            buffer.append("暫無數據");
        }

        content.setText(buffer.toString());
    }

    private void upData(LoginBean loginBean){
        ObjectBoxUtils.addData(loginBean,LoginBean.class);
    }
}

 

xml佈局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">


            <EditText
                android:id="@+id/loginName"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:hint="請輸入用戶名"/>


            <EditText
                android:id="@+id/passWord"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:hint="請輸入密碼"/>


            <Button
                android:id="@+id/login"
                android:layout_width="match_parent"
                android:layout_margin="10dp"
                android:layout_height="60dp"
                android:text="登陸"/>


            <Button
                android:id="@+id/getAll"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:text="獲取全部數據"/>


            <Button
                android:id="@+id/update"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:text="更新id爲1的數據"/>

            <Button
                android:id="@+id/delete"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:text="刪除id爲1的數據"/>


            <Button
                android:id="@+id/deleteAll"
                android:layout_width="match_parent"
                android:layout_height="60dp"
                android:layout_margin="10dp"
                android:text="刪除全部數據"/>




            <TextView
                android:id="@+id/content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorAccent"
                android:textColor="@android:color/white"
                android:layout_margin="20dp"/>


        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>





</LinearLayout>

 

public static  <T> void remove( T t){
    Box<T> box = (Box<T>) ObjectBox.getBoxStore().boxFor(t.getClass());
    box.removeAll();
}

 

注意:記得在manifests添加Appliction

相關文章
相關標籤/搜索