打开/关闭单个与多个插入调用的数据库模式

时间:2016-09-27 00:00:11

标签: java android sql database sqlite

例如考虑这个功能

public void insertRow(CoolObject coolObject) {
    ContentValues values = new ContentValues();
    values.put("some field name", coolObject.getSomeValue()); 
    //and so on and so on

    mDatabase.open();
    mDatabase.insertWithOnConflict("CoolTable", 
        null, 
        values, 
        SQLiteDatabase.CONFLICT_IGNORE);
    mDatabase.close();
}

我打开数据库,使用数据库执行某种SQL命令,然后再次关闭数据库。

现在考虑一下:

public void insertRows(List<CoolObject> coolObjectList) {
    mDatabase.beginTransaction();
    try {
        for (CoolObject coolObject : coolObjectList) {
            insertRow(coolObject);
        }
        mDatabase.setTransactionSuccessful();
    }
    finally {
        mDatabase.endTransaction();
    }
}

在这种情况下,我运行一个循环,重复调用insertRow(),但是在单个数据库事务的框架内。

我的问题:

这是一个我打开和关闭的问题吗?它可能对单个调用有意义,但我担心如果我一遍又一遍地调用插入行,那就是大量的开启和关闭。

如果数据库在我完成行操作时关闭,我是否必须再次打开它,即使是mDatabase.beginTransaction();mDatabase.setTransactionSuccessful();mDatabase.endTransaction();之类的东西?

我也不能只是打开和关闭insertRow()并将其添加到insertRows()方法的开头和结尾,因为那时它是,好吧,不是insertRow() 1}}现在如果我想单独调用该函数,我就不再打开/关闭了。

解决这些错误的可接受方法是什么?

2 个答案:

答案 0 :(得分:0)

  
    

这是一个我打开和关闭的问题吗?它可能对单个调用有意义,但我担心如果我一遍又一遍地调用插入行,那就是大量的开启和关闭。

  

根据数据库的不同,每次都会打开一个新的进程或线程,这个进程或线程并不是真正有效的,而且它可能无法正常关闭......

尝试组合插入,这将有助于保持较低的资源。

如果您有机会并且仍希望采用第一种方式,请实施一个连接池,以保持连接打开。

答案 1 :(得分:0)

public void insertRow(CoolObject coolObject) {
    ContentValues values = new ContentValues();
    values.put("some field name", coolObject.getSomeValue()); 
    //and so on and so on

    mDatabase.open();
    try {
        // Do whatever you want to do with your connection
        mDatabase.insertWithOnConflict("CoolTable", 
            null, 
            values, 
            SQLiteDatabase.CONFLICT_IGNORE);
    }catch(Exception err) {
        // handle error
    }finally {
        mDatabase.close();        
    }
}

在我看来,上面的代码可以让你处理大多数情况。在上面的方法中,如果mDatabase.open()抛出错误,那将是一个问题。要处理这种情况,您可以将connection作为资源参数传递给try方法。