ska*_*abo 5 java android database-design ormlite
我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,拥有所有模型对象的所有函数的DatabaseManager是否合适,例如:
listCarById(int id)
listPlaneById(int id)
removeCar(int id)
removePlane(int id)
Run Code Online (Sandbox Code Playgroud)
等等.....
根据格雷的评论进行更新。
小心你的“单例”实现。您的init方法应该是synchronized确保您不会DatabaseManager由于并发问题而最终获得类的多个实例。我只需将init和getInstance方法组合到以下内容(注意添加的同步关键字):
public static synchronized DatabaseManager getInstance(Context c)
{
if(instance == null)
instance = new DatabaseManager(c);
return instance;
}
Run Code Online (Sandbox Code Playgroud)
如需进一步阅读,请查看 Kevin Galligan( ORMlite贡献者之一)撰写的关于单一 SQLite 连接和Android Sqlite 锁定的博客文章。
更新:
为了回答你关于如何组织你的加载方法的问题getAllCars,我首先建议制作它们static,因为除了你的方法之外,它们不依赖于任何其他东西来获取你的单例DatabaseManager,当然,这也是static。如果您有少量这些类型的方法,则可以将它们全部设为DatabaseManger. 如果有很多,您可以为与某个类型对应的所有静态方法创建一个辅助类。
如果您有一个方法确实CarMDL依赖于或的给定实例的内部MarkMDL(就像您需要一个方法来获取一些关联的引用),请考虑使这些方法成为CarMDL或MarkMDL类的成员。
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |