Является ли Android SQLiteStatement (подготовленный оператор) поточно-ориентированным? То есть такое "связать *, связать * ... выполнить" атомарно? - PullRequest
1 голос
/ 20 сентября 2010

Мне интересно, являются ли подготовленные операторы в Android (экземпляры SQLiteStatement) поточно-ориентированными.В частности, я спрашиваю относительно следующего сценария:

В ContentProvider вы создаете предварительно скомпилированный оператор вставки во время onCreate.Затем в переопределенном методе вставки вы используете этот оператор, привязывая к нему набор параметров и вызывая для него executeInsert.

Мы знаем, что ContentProvider должен быть написан потокобезопасным способом.Если SQLiteStatement не связывает параметры для каждого потока, одновременный вызов метода вставки провайдера изменит привязки оператора и приведет к непредсказуемому поведению.

Собственный поставщик контактов Android использует подготовленные операторы таким образом (http://bit.ly/bDuKAT), поэтому я склонен полагать, что они на самом деле поточнобезопасны. Глядя на исходный код SQLiteStatement, я не вижу, каким образом (http://bit.ly/9M1Swv).

Итак, является ли SQLiteStatement (или SQLiteProgram, который является) потоком-безопасен в отношении привязки параметров или нет?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

В документации по SQLiteStatement прямо указано *1002*, что

SQLiteStatement не внутренне синхронизирован

Таким образом, класс не является потокобезопасными не может использоваться несколькими потоками одновременно без неожиданных результатов.

1 голос
/ 20 сентября 2010

Если это два отдельных метода, то он не может быть потокобезопасным:

mStatusUpdateDelete.bindLong(1, dataId);
mStatusUpdateDelete.execute();

Первый поток может вызвать bindLong с 1, затем второй поток с 2, а затем оба потока могут вызвать execute. Так что даже если bindLong и execute внутренне поточно-ориентированы, это не поможет.

...