Каков наилучший способ создания соединения greenDAO DB только один раз для одного запуска приложения?

В настоящее время я создаю соединение greenDAO DB в классе (который открывает соединение в каждом статическом методе) и использует его везде, где он мне нужен. Но я не уверен, что это лучший способ сделать это. Может ли кто-нибудь предложить лучший способ сделать это?

Мой код:

import com.knowlarity.sr.db.dao.DaoMaster; import com.knowlarity.sr.db.dao.DaoMaster.DevOpenHelper; import com.knowlarity.sr.db.dao.DaoSession; import com.knowlarity.sr.db.dao.IEntity; public class DbUtils { private static Object lockCallRecord =new Object(); private DbUtils(){}; public static boolean saveEntity(Context context , IEntity entity){ boolean t=false; DevOpenHelper helper=null; SQLiteDatabase db=null; DaoMaster daoMaster=null; DaoSession daoSession =null; try{ helper = new DaoMaster.DevOpenHelper(context, IConstant.DB_STRING, null); db = helper.getReadableDatabase(); daoMaster = new DaoMaster(db); daoSession = daoMaster.newSession(); //Some business logic here for fetching and inserting the data. }catch (Exception e){ Log.e("saveEntity", e.getStackTrace().toString()); }finally{ if(daoSession!=null)daoSession.clear(); daoMaster=null; if(db.isOpen())db.close(); helper.close(); } return t; } 

Ваш подход заставляет загружать базу данных очень часто, что не является необходимым и может значительно замедлить ваше приложение.

Откройте базу данных один раз и сохраните ее где-нибудь и запросите ее оттуда, если необходимо.

Лично я использую глобальную DaoSession и локальную DaoSession . Локальный DaoSession используется, когда в кеше сеанса ничего не должно оставаться (т.е. сохранение нового объекта в базе данных, который, вероятно, будет использоваться только очень редко или выполнить некоторые запросы, которые будут загружать множество объектов, которые вряд ли будут повторно использоваться еще раз).

Имейте в виду, что обновление объектов в локальной DaoSession является плохой идеей, если вы используете объект на своей глобальной сессии. Если вы сделаете это, кэшированный объект в вашем глобальном сеансе не будет обновлен, и вы получите неправильные результаты, если вы не очистите кеш глобальной сессии!

Таким образом, самый безопасный способ – либо просто использовать один DaoSession или новый DaoSession все время и не использовать глобальные и локальные сессии !!!

Пользовательский класс приложений является хорошим местом, но любой другой класс также будет в порядке.

Вот как я это делаю:

Класс DBHelper:

 private SQLiteDatabase _db = null; private DaoSession _session = null; private DaoMaster getMaster() { if (_db == null) { _db = getDatabase(DB_NAME, false); } return new DaoMaster(_db); } public DaoSession getSession(boolean newSession) { if (newSession) { return getMaster().newSession(); } if (_session == null) { _session = getMaster().newSession(); } return _session; } private synchronized SQLiteDatabase getDatabase(String name, boolean readOnly) { String s = "getDB(" + name + ",readonly=" + (readOnly ? "true" : "false") + ")"; try { readOnly = false; Log.i(TAG, s); SQLiteOpenHelper helper = new MyOpenHelper(context, name, null); if (readOnly) { return helper.getReadableDatabase(); } else { return helper.getWritableDatabase(); } } catch (Exception ex) { Log.e(TAG, s, ex); return null; } catch (Error err) { Log.e(TAG, s, err); return null; } } private class MyOpenHelper extends DaoMaster.OpenHelper { public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) { super(context, name, factory); } @Override public void onCreate(SQLiteDatabase db) { Log.i(TAG, "Create DB-Schema (version "+Integer.toString(DaoMaster.SCHEMA_VERSION)+")"); super.onCreate(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "Update DB-Schema to version: "+Integer.toString(oldVersion)+"->"+Integer.toString(newVersion)); switch (oldVersion) { case 1: db.execSQL(SQL_UPGRADE_1To2); case 2: db.execSQL(SQL_UPGRADE_2To3); break; default: break; } } } 

В классе приложений:

 private static MyApplication _INSTANCE = null; public static MyApplication getInstance() { return _INSTANCE; } @Override public void onCreate() { _INSTANCE = this; // ... } private DBHelper _dbHelper = new DBHelper(); public static DaoSession getNewSession() { return getInstance()._dbHelper.getSession(true); } public static DaoSession getSession() { return getInstance()._dbHelper.getSession(false); } 

Конечно, вы также можете хранить DaoMaster вместо самой базы данных. Это уменьшит некоторые небольшие накладные расходы.

Я использую Singleton-подобный класс приложения и статические методы, чтобы избежать приведения приложения ( ((MyApplication)getApplication()) ) каждый раз, когда я использую некоторые из общих методов (например, доступ к БД).

Я бы рекомендовал создать вашу базу данных в вашем классе Application. Затем вы можете создать метод, чтобы вернуть DaoSession, чтобы получить доступ к базе данных в других действиях.

Intereting Posts