gpt4 book ai didi

java - 拥有一个具有所有模型对象的所有功能的 DatabaseManager 好吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:23 25 4
gpt4 key购买 nike

我正在使用 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 类的多个实例。我只是将 initgetInstance 方法组合到以下(注意添加的 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 的所有静态成员。如果你有很多,你可以为对应于一个类型的所有静态方法创建一个帮助类。

如果您有一个方法确实依赖于 CarMDLMarkMDL 的给定实例的内部结构(就像您需要一个方法来获取一些关联的引用),考虑使这些方法成为 CarMDLMarkMDL 类的成员。

关于java - 拥有一个具有所有模型对象的所有功能的 DatabaseManager 好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10079501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com