Android 如何使用Dao.setAutoCommit()?

Android 如何使用Dao.setAutoCommit()?,android,ormlite,Android,Ormlite,我从服务器解析JSON,在读取对象时使用ORMLite将对象持久化到数据库。文件可能会变得非常大,因此我的想法是在读取对象时一次提交一个对象,而不是将数百个对象读入内存并进行大规模提交(毕竟,智能手机上的内存非常有限)。但是,每个对象都将包含一个具有多个值的集合(我试图对这些值使用ForeignCollection,因此每个值都需要被视为一个单独的对象),并且认为最好一次提交对象集合中的所有项,而不是提交,例如,每个单独的字符串或整数 我相信要在批处理中进行一组提交,我只需调用dao.setAu

我从服务器解析JSON,在读取对象时使用ORMLite将对象持久化到数据库。文件可能会变得非常大,因此我的想法是在读取对象时一次提交一个对象,而不是将数百个对象读入内存并进行大规模提交(毕竟,智能手机上的内存非常有限)。但是,每个对象都将包含一个具有多个值的集合(我试图对这些值使用
ForeignCollection
,因此每个值都需要被视为一个单独的对象),并且认为最好一次提交对象集合中的所有项,而不是提交,例如,每个单独的字符串或整数

我相信要在批处理中进行一组提交,我只需调用
dao.setAutoCommit(false)
,调用
dao.create()
,为每个项目调用
dao.commit()
,然后调用
dao.setAutoCommit(true)
,返回到逐段提交

我有三个问题:

  • 在执行过程中提交是正确的,还是应该进行批量提交——即使这意味着一次可以提交多达1000个对象
  • 一次提交一个项目集合,还是成批提交
  • 从该
    dao.setAutoCommit()
    dao.commit()
    所需的
    databaseConnection
    值的哪里获取?也许我错过了,但在文档或示例中找不到
  • 在执行过程中提交是正确的,还是应该进行批量提交——即使这意味着一次可以提交多达1000个对象

    如果您有大量的项目,那么最好一次提交100个对象,而不是1000个。这在很大程度上取决于对象的大小,因此使用不同的批处理大小运行它并对它们进行计时将是一件值得尝试的事情。正如您所提到的,您需要平衡内存和数据库性能。我对结果很好奇,所以请用你的时间数据来评论

    一次提交一个项目集合,还是成批提交

    分批做事当然更好。这是真实的几乎每一个数据库我曾经工作过

    如果您谈论的是外部集合,那么外部对象集合和要创建的大型对象列表之间实际上没有区别。两者都将受益于配料

    我不会在创建每个外部对象之后提交。我宁愿将100个(比方说)外部对象和它们所拥有的任何相关的外部对象进行批量处理。然后提交100的更改并执行下一个100。然后将100改为200,然后尝试50,以此类推。。你应该看到拐点

    我回答对了吗

    从该
    dao.setAutoCommit()
    dao.commit()
    请求的数据库连接值从何处获取?也许我错过了,但在文档或示例中找不到

    编辑#2:

    正如@Chad所指出的,我建议在Android下使用自动提交是错误的。尽管Sqlite驱动程序通常通过启动事务并在完成时提交来支持自动提交。然而,Android似乎并不支持这一点。在Android数据库连接中,代码是禁止操作的

    在Android下,使用ORMLite执行批处理任务的正确方法是使用。比如:

    accountDao.callBatchTasks(connectionSource,
      new Callable<Void>() {
        public Void call() throws SQLException {
            // insert a number of accounts at once
            for (Account account : accountsToInsert) {
               // update our account object
               accountDao.create(account);
            }
            return null;
        }
    });
    
    accountDao.callBatchTasks(connectionSource,
    新的可调用(){
    public Void call()引发SQLException{
    //一次插入多个帐户
    对于(帐户:accountsToInsert){
    //更新我们的帐户对象
    accountDao.create(account);
    }
    返回null;
    }
    });
    
    Ah。。。因此,如果我无法扩展OrmLiteBaseActivity,我可以使用:DatabaseHelper DatabaseHelper=OpenHelperManager.getHelper(上下文,DatabaseHelper.class);DatabaseConnection connection=databaseHelper.getConnectionSource().getReadWriteConnection();setAutoCommit(连接,false);感谢您的大力支持!取消那个@Chad。我已使用
    setAutoCommit()
    的正确方法编辑了我的答案。脑屁!