Android SQLite: should I use beginTransaction and endTransaction only at insert or both insert and read...











up vote
2
down vote

favorite












ATM when I write to the SQLite in my android app, I do it this way:



try {
for (User user: users) {
ContentValues values = new ContentValues();
databaseManager.database.beginTransaction();
values.put("user_name", user.getName());
values.put("user_email", user.getEmail());
databaseManager.database.insert("users", null, values);
}
databaseManager.database.setTransactionSuccessful();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
databaseManager.database.endTransaction();
}


But when I read from the DB, I dont use begin, setsuccessful and end:



Cursor cursor = databaseManager.database.rawQuery(SQLQueries.getUsers(), null);
if (cursor.moveToFirst()) {
if (cursor!=null) {
do {
User user = new User();
try {
user.setName(cursor.getString(cursor.getColumnIndexOrThrow("user_name")));
user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("user_email")));
} catch (Exception ex) {
ex.printStackTrace();
}
users.add(user);
} while (cursor.moveToNext());
}
}

if (cursor != null && !cursor.isClosed()) {
cursor.close();
cursor = null;
}


Should I add beginTransaction, setTransactionSuccessful and endTransaction to the read operations as well? Im pretty sure I shouldnt, but I need to be 100% on this one.










share|improve this question




























    up vote
    2
    down vote

    favorite












    ATM when I write to the SQLite in my android app, I do it this way:



    try {
    for (User user: users) {
    ContentValues values = new ContentValues();
    databaseManager.database.beginTransaction();
    values.put("user_name", user.getName());
    values.put("user_email", user.getEmail());
    databaseManager.database.insert("users", null, values);
    }
    databaseManager.database.setTransactionSuccessful();
    } catch (Exception ex) {
    ex.printStackTrace();
    } finally {
    databaseManager.database.endTransaction();
    }


    But when I read from the DB, I dont use begin, setsuccessful and end:



    Cursor cursor = databaseManager.database.rawQuery(SQLQueries.getUsers(), null);
    if (cursor.moveToFirst()) {
    if (cursor!=null) {
    do {
    User user = new User();
    try {
    user.setName(cursor.getString(cursor.getColumnIndexOrThrow("user_name")));
    user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("user_email")));
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    users.add(user);
    } while (cursor.moveToNext());
    }
    }

    if (cursor != null && !cursor.isClosed()) {
    cursor.close();
    cursor = null;
    }


    Should I add beginTransaction, setTransactionSuccessful and endTransaction to the read operations as well? Im pretty sure I shouldnt, but I need to be 100% on this one.










    share|improve this question


























      up vote
      2
      down vote

      favorite









      up vote
      2
      down vote

      favorite











      ATM when I write to the SQLite in my android app, I do it this way:



      try {
      for (User user: users) {
      ContentValues values = new ContentValues();
      databaseManager.database.beginTransaction();
      values.put("user_name", user.getName());
      values.put("user_email", user.getEmail());
      databaseManager.database.insert("users", null, values);
      }
      databaseManager.database.setTransactionSuccessful();
      } catch (Exception ex) {
      ex.printStackTrace();
      } finally {
      databaseManager.database.endTransaction();
      }


      But when I read from the DB, I dont use begin, setsuccessful and end:



      Cursor cursor = databaseManager.database.rawQuery(SQLQueries.getUsers(), null);
      if (cursor.moveToFirst()) {
      if (cursor!=null) {
      do {
      User user = new User();
      try {
      user.setName(cursor.getString(cursor.getColumnIndexOrThrow("user_name")));
      user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("user_email")));
      } catch (Exception ex) {
      ex.printStackTrace();
      }
      users.add(user);
      } while (cursor.moveToNext());
      }
      }

      if (cursor != null && !cursor.isClosed()) {
      cursor.close();
      cursor = null;
      }


      Should I add beginTransaction, setTransactionSuccessful and endTransaction to the read operations as well? Im pretty sure I shouldnt, but I need to be 100% on this one.










      share|improve this question















      ATM when I write to the SQLite in my android app, I do it this way:



      try {
      for (User user: users) {
      ContentValues values = new ContentValues();
      databaseManager.database.beginTransaction();
      values.put("user_name", user.getName());
      values.put("user_email", user.getEmail());
      databaseManager.database.insert("users", null, values);
      }
      databaseManager.database.setTransactionSuccessful();
      } catch (Exception ex) {
      ex.printStackTrace();
      } finally {
      databaseManager.database.endTransaction();
      }


      But when I read from the DB, I dont use begin, setsuccessful and end:



      Cursor cursor = databaseManager.database.rawQuery(SQLQueries.getUsers(), null);
      if (cursor.moveToFirst()) {
      if (cursor!=null) {
      do {
      User user = new User();
      try {
      user.setName(cursor.getString(cursor.getColumnIndexOrThrow("user_name")));
      user.setEmail(cursor.getString(cursor.getColumnIndexOrThrow("user_email")));
      } catch (Exception ex) {
      ex.printStackTrace();
      }
      users.add(user);
      } while (cursor.moveToNext());
      }
      }

      if (cursor != null && !cursor.isClosed()) {
      cursor.close();
      cursor = null;
      }


      Should I add beginTransaction, setTransactionSuccessful and endTransaction to the read operations as well? Im pretty sure I shouldnt, but I need to be 100% on this one.







      android sqlite






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 10 at 22:57









      Vergiliy

      308




      308










      asked Jul 14 '14 at 7:29









      J. K.

      6,0001461133




      6,0001461133
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          5
          down vote



          accepted










          When you are not using explicit transactions, SQLite will automatically wrap a transaction around every statement.



          When you write to the database, every insert/update/delete call is a single statement.
          If you are doing multiple such operations, you use transactions to avoid paying the transaction overhead for each of them.



          A query (query or rawQuery) is a single statement, even if it returns multiple rows.
          Therefore, using a transaction around a single query does not make any difference.
          (If you have multiple queries, you could use a transaction to ensure that their results are consistent with each other even if another thread attempts to change the database between them.)






          share|improve this answer





















          • so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
            – J. K.
            Jul 14 '14 at 8:04










          • That depends on whether you need them to be atomic.
            – CL.
            Jul 14 '14 at 8:13










          • I see, thanks :)
            – J. K.
            Jul 14 '14 at 8:22






          • 1




            More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
            – Kling Klang
            Jul 14 '14 at 15:26













          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














           

          draft saved


          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24731561%2fandroid-sqlite-should-i-use-begintransaction-and-endtransaction-only-at-insert%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          5
          down vote



          accepted










          When you are not using explicit transactions, SQLite will automatically wrap a transaction around every statement.



          When you write to the database, every insert/update/delete call is a single statement.
          If you are doing multiple such operations, you use transactions to avoid paying the transaction overhead for each of them.



          A query (query or rawQuery) is a single statement, even if it returns multiple rows.
          Therefore, using a transaction around a single query does not make any difference.
          (If you have multiple queries, you could use a transaction to ensure that their results are consistent with each other even if another thread attempts to change the database between them.)






          share|improve this answer





















          • so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
            – J. K.
            Jul 14 '14 at 8:04










          • That depends on whether you need them to be atomic.
            – CL.
            Jul 14 '14 at 8:13










          • I see, thanks :)
            – J. K.
            Jul 14 '14 at 8:22






          • 1




            More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
            – Kling Klang
            Jul 14 '14 at 15:26

















          up vote
          5
          down vote



          accepted










          When you are not using explicit transactions, SQLite will automatically wrap a transaction around every statement.



          When you write to the database, every insert/update/delete call is a single statement.
          If you are doing multiple such operations, you use transactions to avoid paying the transaction overhead for each of them.



          A query (query or rawQuery) is a single statement, even if it returns multiple rows.
          Therefore, using a transaction around a single query does not make any difference.
          (If you have multiple queries, you could use a transaction to ensure that their results are consistent with each other even if another thread attempts to change the database between them.)






          share|improve this answer





















          • so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
            – J. K.
            Jul 14 '14 at 8:04










          • That depends on whether you need them to be atomic.
            – CL.
            Jul 14 '14 at 8:13










          • I see, thanks :)
            – J. K.
            Jul 14 '14 at 8:22






          • 1




            More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
            – Kling Klang
            Jul 14 '14 at 15:26















          up vote
          5
          down vote



          accepted







          up vote
          5
          down vote



          accepted






          When you are not using explicit transactions, SQLite will automatically wrap a transaction around every statement.



          When you write to the database, every insert/update/delete call is a single statement.
          If you are doing multiple such operations, you use transactions to avoid paying the transaction overhead for each of them.



          A query (query or rawQuery) is a single statement, even if it returns multiple rows.
          Therefore, using a transaction around a single query does not make any difference.
          (If you have multiple queries, you could use a transaction to ensure that their results are consistent with each other even if another thread attempts to change the database between them.)






          share|improve this answer












          When you are not using explicit transactions, SQLite will automatically wrap a transaction around every statement.



          When you write to the database, every insert/update/delete call is a single statement.
          If you are doing multiple such operations, you use transactions to avoid paying the transaction overhead for each of them.



          A query (query or rawQuery) is a single statement, even if it returns multiple rows.
          Therefore, using a transaction around a single query does not make any difference.
          (If you have multiple queries, you could use a transaction to ensure that their results are consistent with each other even if another thread attempts to change the database between them.)







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Jul 14 '14 at 7:57









          CL.

          133k12116151




          133k12116151












          • so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
            – J. K.
            Jul 14 '14 at 8:04










          • That depends on whether you need them to be atomic.
            – CL.
            Jul 14 '14 at 8:13










          • I see, thanks :)
            – J. K.
            Jul 14 '14 at 8:22






          • 1




            More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
            – Kling Klang
            Jul 14 '14 at 15:26




















          • so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
            – J. K.
            Jul 14 '14 at 8:04










          • That depends on whether you need them to be atomic.
            – CL.
            Jul 14 '14 at 8:13










          • I see, thanks :)
            – J. K.
            Jul 14 '14 at 8:22






          • 1




            More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
            – Kling Klang
            Jul 14 '14 at 15:26


















          so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
          – J. K.
          Jul 14 '14 at 8:04




          so If I have multiple reads, I should wrap them all in a begin/set/end transaction?
          – J. K.
          Jul 14 '14 at 8:04












          That depends on whether you need them to be atomic.
          – CL.
          Jul 14 '14 at 8:13




          That depends on whether you need them to be atomic.
          – CL.
          Jul 14 '14 at 8:13












          I see, thanks :)
          – J. K.
          Jul 14 '14 at 8:22




          I see, thanks :)
          – J. K.
          Jul 14 '14 at 8:22




          1




          1




          More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
          – Kling Klang
          Jul 14 '14 at 15:26






          More, since a query doesn't modify the database contents, including it in a transaction would be meaningless. So use transactions for commands, multiple ones: should they succeed or fail all together.
          – Kling Klang
          Jul 14 '14 at 15:26




















           

          draft saved


          draft discarded



















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f24731561%2fandroid-sqlite-should-i-use-begintransaction-and-endtransaction-only-at-insert%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Florida Star v. B. J. F.

          Danny Elfman

          Lugert, Oklahoma