官網: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