我正在使用 ORmlite 开发一个数据库应用程序,我的模型是这样的:
MDL 对象..
DatabaseTable(tableName = "UserCars")
public class CarMDL
{
@DatabaseField(generatedId = true)
private int _id;
@DatabaseField(columnName = "name")
private String _name;
//................. etc
}
// DB Helper class...
public class DatabaseHelper extends OrmLiteSqliteOpenHelper
{
private Dao<CarMDL,Integer> _carDao = null;
@Override
public void onCreate(SQLiteDatabase database,ConnectionSource connectionSource)
{
try
{
TableUtils.createTable(connectionSource, CarMDL.class);
} catch (SQLException e)
{
throw new RuntimeException(e);
} catch (java.sql.SQLException e)
{
e.printStackTrace();
}
}
public Dao<CarMDL, Integer> getCarDao()
{
if (null == _carDao)
{
try
{
_carDao = getDao(CarMDL.class);
}catch (java.sql.SQLException e)
{
e.printStackTrace();
}
}
return _carDao;
}
}
// DatabaseManager class...
public class DatabaseManager
{
static private DatabaseManager instance;
private DatabaseHelper helper;
static public void init(Context ctx)
{
if (null == instance)
{
instance = new DatabaseManager(ctx);
}
}
static public DatabaseManager getInstance()
{
return instance;
}
private DatabaseManager(Context ctx)
{
helper = new DatabaseHelper(ctx);
}
private DatabaseHelper getHelper()
{
return helper;
}
// All the Dao functions of all MDL objects are in this class, for example:
public List<CarMDL> getAllCars()
{
List<CarMDL> carLists = null;
try
{
carLists = getHelper().getCarDao().queryForAll();
} catch (SQLException e)
{
e.printStackTrace();
}
return carLists;
}
// This is another MDL object..
public List<MarkMDL> getAllMarks()
{
List<MarkMDL> marks = null;
try
{
marks = getHelper().getMarkDao().queryForAll();
} catch (SQLException e)
{
e.printStackTrace();
}
return marks;
}
}
所以我的问题是,拥有一个具有所有模型对象的所有功能的 DatabaseManager 是否很好,例如:
listCarById(int id)
listPlaneById(int id)
removeCar(int id)
removePlane(int id)
等等......
最佳答案
根据 Gray 的评论更新。
小心你的“单例”实现。您的 init
方法应该是 synchronized
以确保您不会因为并发问题而导致 DatabaseManager
类的多个实例。我只是将 init
和 getInstance
方法组合到以下(注意添加的 synchronized 关键字):
public static synchronized DatabaseManager getInstance(Context c)
{
if(instance == null)
instance = new DatabaseManager(c);
return instance;
}
要进一步阅读,请查看这些关于 Single SQLite Connection 的博客文章和 Android Sqlite locking作者:Kevin Galligan(ORMlite 的 contributors 之一)。
更新:
要回答有关如何组织像 getAllCars
这样的加载方法的问题,我首先建议将它们设为 static
,因为除了您的方法之外它们不依赖于任何其他内容获取 DatabaseManager
的单例,当然,它也是 static
。如果您只有少数这些类型的方法,您可以将它们设为 DatabaseManger
的所有静态成员。如果你有很多,你可以为对应于一个类型的所有静态方法创建一个帮助类。
如果您有一个方法确实依赖于 CarMDL
或 MarkMDL
的给定实例的内部结构(就像您需要一个方法来获取一些关联的引用),考虑使这些方法成为 CarMDL
或 MarkMDL
类的成员。
关于java - 拥有一个具有所有模型对象的所有功能的 DatabaseManager 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10079501/