public void Save(MarkovFactory factory) { Log.Debug ( TAG, "Saving chain." ); myDatabase = context.OpenOrCreateDatabase(DATABASE_NAME, FileCreationMode.Private, null); myDatabase.ExecSQL("DROP TABLE IF EXISTS 'words'"); myDatabase.ExecSQL("CREATE TABLE IF NOT EXISTS 'words' (firstWord TEXT, secondWord TEXT, instanceCount INTEGER NOT NULL);"); var chain = factory.chain; DatabaseUtils.InsertHelper ih = new DatabaseUtils.InsertHelper (myDatabase, "words"); Stopwatch stopwatch = Stopwatch.StartNew(); StringBuilder insertQuery = new StringBuilder(); //insertQuery.Append("INSERT INTO 'words' ('firstWord', 'secondWord', 'instanceCount') VALUES (?, ?, ?)"); myDatabase.BeginTransaction(); string sql = "INSERT INTO 'words' ('firstWord', 'secondWord', 'instanceCount') VALUES (?, ?, ?)"; SQLiteStatement insert = myDatabase.CompileStatement(sql); foreach (KeyValuePair<string, MarkovWord> word in chain) { foreach (KeyValuePair<MarkovWord, int> after in word.Value.afters) { insert.BindString(1, word.Value.word); insert.BindString(2, after.Key.word); insert.BindDouble(3, after.Value); insert.Execute(); } } myDatabase.SetTransactionSuccessful(); myDatabase.EndTransaction(); stopwatch.Stop (); Log.Debug (TAG, "Database insert completed in " + stopwatch.Elapsed.TotalMilliseconds); }