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

标签 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;       
    }

}

所以我的问题是,拥有一个具有所有模型对象的所有功能的 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/

相关文章:

android - 应使用哪种布局来显示 "footer",具体取决于屏幕的其余部分内容

postgresql - 如何防止在父表中插入?

php - 如何通过联合来区分查询

java - 在 UI 线程之外修改 FXCollections.synchronizedObservableList

java - 安卓、Java : Resized Bitmap ignores bitmap options

java - 整数作为原始类型

java - 将 GATE 嵌入到 JAR 中以与 gatewayHome 一起使用

java - 安卓/JAVA : Async functions call to avoid blocking calls

Android:如何设置PreferenceActivity的Preference自定义布局的ImageView

asp.net - Multi-Tenancy 或非 Multi-Tenancy