Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Добрый день.
не подскажите почему при обновлении всех raw в таблице метод возвращает ноль(хотя колонка заполняется данными)?
db.execSQL("alter table " + DATABASE_TABLE + " add column "
+ KEY_PIC + " text;");
db.update(DATABASE_TABLE, updateCV, null, null);
db.update возвращает 0 даже если 10 строчек обновлены.
не подскажите почему при обновлении всех raw в таблице метод возвращает ноль(хотя колонка заполняется данными)?
db.execSQL("alter table " + DATABASE_TABLE + " add column "
+ KEY_PIC + " text;");
db.update(DATABASE_TABLE, updateCV, null, null);
db.update возвращает 0 даже если 10 строчек обновлены.
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Как такое получение данных правильно оформить в транзакцию?
Код: Выделить всё
query = new ParseQuery("mens");
query.setLimit(50);
query.findInBackground(new FindCallback() {
public void done(List<ParseObject> mens, ParseException e) {
if (e == null) {
for ( int i = 0; i < 50; i++) {
stGet = mens.get(i).getString("Str");
cv.put("email", stGet);
long rowID = db.insert("mytable", null, cv);
Toast.makeText(getApplicationContext(), "Вставка ID = " + rowID, Toast.LENGTH_SHORT).show();
}
}
}
});
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
не получение, а вставку
Просто до цикла for стартани ее, а после цикла - завершай.
А вообще я просто объект передаю методу хэлпера и там стартую транзакцию и разбираю объект на части-вставки.
Просто до цикла for стартани ее, а после цикла - завершай.
А вообще я просто объект передаю методу хэлпера и там стартую транзакцию и разбираю объект на части-вставки.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Foenix писал(а): Просто до цикла for стартани ее, а после цикла - завершай.
Код: Выделить всё
query = new ParseQuery("mens");
query.setLimit(50);
query.findInBackground(new FindCallback() {
public void done(List<ParseObject> mens, ParseException e) {
if (e == null) {
db.beginTransaction();
for ( int i = 0; i < 50; i++) {
stGet = mens.get(i).getString("Str");
cv.put("email", stGet);
long rowID = db.insert("mytable", null, cv);
db.endTransaction();
Toast.makeText(getApplicationContext(), "Вставка ID = " + rowID, Toast.LENGTH_SHORT).show();
}
}
}
});
И тут же есть вопрос по уроку: в уроке везде идёт db.beginTransaction(); и db.endTransaction();, а в конце написано, что нужно использовать finally, как правильно?
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
неправильно. Финишировать нужно в finaly и ЗА циклом, когда уже все записи вставлены.
Код: Выделить всё
mDatabase.beginTransaction();
try{
//тут весь твой цикл целиком
mDatabase.setTransactionSuccessful();
}catch(Exception e){
//Обрабатываем ошибку
}
finally {
mDatabase.endTransaction();
}
}
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Спасибо, всё работает
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Здравствуйте!
Объясните, пожалуйста, откуда и какие данные вставляет транзакция в таблицу в этом примере:
db.beginTransaction();
insert(db, "mytable", "val1");
- это просто вставляется пустая строка с id=1?
Спасибо!
Объясните, пожалуйста, откуда и какие данные вставляет транзакция в таблицу в этом примере:
db.beginTransaction();
insert(db, "mytable", "val1");
- это просто вставляется пустая строка с id=1?
Спасибо!
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
немного поправлю.. транзакция никуда и ничего не вставляет. Вначале в этом примере мы стартуем транзакцию - т.е. говорим о том, что последует серия каких-либо команд по вставке-удалению-изменению базы данных, которая должна выполниться целиком или, в случае чего-то, не выполняться (тогда база данных будет возвращена в положение до старта транзакции)
далее идет операция вставки, однако - с ошибкой.
Вставляется же примерно так:
1 строка - инициализируем специальную переменную, которая будет содержать ПАРЫ значений - имя поля и его значение.
2 строка - добавляем туда к примеру 1 пару
3 строка - вставка.
Таким образом в вашем примере неверный третий параметр, это не строковая величина должна быть, а типа
ContentValues
Затем нужно отловить ошибки и подтвердить или откатить транзакцию в случае ошибки либо еще чего-то.
далее идет операция вставки, однако - с ошибкой.
Вставляется же примерно так:
Код: Выделить всё
ContentValues values = new ContentValues();
values.put("Name", queryValues.get("name"));
database.insert("student", null, values);
2 строка - добавляем туда к примеру 1 пару
3 строка - вставка.
Таким образом в вашем примере неверный третий параметр, это не строковая величина должна быть, а типа
ContentValues
Затем нужно отловить ошибки и подтвердить или откатить транзакцию в случае ошибки либо еще чего-то.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Еще хотелось бы добавить по поводу доступ в БД из разных потоков (то есть обеспечение потокобезопасности) и использование синглтона для этого. А также правильное закрытие БД в этом случае.
Получаем SQLiteDatabase через такой синглтон.
Тогда можем работать с БД так, в том числе из разных потоков. Закрывать базу напрямую не нужно, только через этот же сингтон!
На базе этого: http://stackoverflow.com/questions/2493 ... on-android
Получаем SQLiteDatabase через такой синглтон.
Код: Выделить всё
public class DatabaseManager {
private int mOpenCounter;
private static DatabaseManager instance;
private static SQLiteOpenHelper mDatabaseHelper;
private SQLiteDatabase mDatabase;
public static synchronized void initializeInstance(SQLiteOpenHelper helper) {
if (instance == null) {
instance = new DatabaseManager();
mDatabaseHelper = helper;
}
}
public static synchronized DatabaseManager getInstance() {
if (instance == null) {
throw new IllegalStateException(DatabaseManager.class.getSimpleName() +
" is not initialized, call initializeInstance(..) method first.");
}
return instance;
}
public synchronized SQLiteDatabase openDatabase() {
mOpenCounter++;
if(mOpenCounter == 1) {
// Opening new database
mDatabase = mDatabaseHelper.getWritableDatabase();
}
return mDatabase;
}
public synchronized void closeDatabase() {
mOpenCounter--;
if(mOpenCounter == 0) {
// Closing database
mDatabase.close();
}
}
}
Код: Выделить всё
// In your application class
DatabaseManager.initializeInstance(new MySQLiteOpenHelper());
//Thread1:
SQLiteDatabase database = DatabaseManager.getInstance().openDatabase();
database.insert(...);
database.update(...);
// database.close(); Don't close it directly!
DatabaseManager.getInstance().closeDatabase(); // correct way
//Thread2:
SQLiteDatabase database = DatabaseManager.getInstance().openDatabase();
database.insert(...);
database.update(...);
DatabaseManager.getInstance().closeDatabase();
Arbeit macht Fry
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
что ж у тебя и статик и инстанс, выбери уж что-нибудь одно и не декларируй этот код как истину, плиз
Код будет работать неэффективно, долго.
И вообще это очень устаревший подход и ненужный. Контент-провайдеры, еще раз повторяю - тем, кто хочет писать по-человечески.
Код будет работать неэффективно, долго.
И вообще это очень устаревший подход и ненужный. Контент-провайдеры, еще раз повторяю - тем, кто хочет писать по-человечески.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Не очень тебя тут понял в смысле статик и инстанс. Ты о чем?Foenix писал(а):что ж у тебя и статик и инстанс, выбери уж что-нибудь одно и не декларируй этот код как истину, плиз
Я и не декларирую как истину, просто как одно из решений, которое попалось )
Я не против контент провайдеров, просто в этом уроке было прямое соединение с БД, поэтому и решение соответствующие.
Кстати, а Content Provider что - автоматически решает проблему с соединением с БД из разных потоков?
Там же точно также используется получение SQLiteDatabase из DBHelper...
Последний раз редактировалось Fry 30 янв 2015, 13:51, всего редактировалось 1 раз.
Arbeit macht Fry
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
решает
про паттерн синглтон почитай, чтоб понять про статик и инстанс.
про паттерн синглтон почитай, чтоб понять про статик и инстанс.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Суть static понимаешь хоть?Fry писал(а):Не очень тебя тут понял в смысле статик и инстанс. Ты о чем?Foenix писал(а):что ж у тебя и статик и инстанс, выбери уж что-нибудь одно и не декларируй этот код как истину, плиз
Я и декларирую как истину, просто как одно из решений, которое попалось )
Я не против контент провайдеров, просто в этом уроке было прямое соединение с БД, поэтому и решение соответствующие.
Кстати, а Content Provider что - автоматически решает проблему с соединением с БД из разных потоков?
Там же точно также используется получение SQLiteDatabase из DBHelper...
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Читал и реализовывал. В чем проблема-то?Foenix писал(а):решает
про паттерн синглтон почитай, чтоб понять про статик и инстанс.
Код рабочий, только что проверял.
Зы. По поводу того, что CP решает проблему совместного доступа ты ожидаемо права. Вот тут http://www.androiddesignpatterns.com/20 ... abase.html решение с CP описывается как полноценная замена темы с синглтоном.
Arbeit macht Fry
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
да ты шо)) это не я права, а гуглты ожидаемо права.
не реализовывал, а копипастил не подумав даже.Читал и реализовывал. В чем проблема-то?
Код рабочий, только что проверял.
ты взял щас на масло намазал масло, а хлеба нет.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Гуглишь чтоли перед тем, как ответы писать? ))Foenix писал(а): да ты шо)) это не я права, а гугл
Не надо тут. Я про него читал в сборнике паттернов и сам писал на разных примерах.не реализовывал, а копипастил не подумав даже.
ты взял щас на масло намазал масло, а хлеба нет.
А конкретно этот пример таки да, скопипастил, но меня в нем не смутило ничего.
Пятый раз спрашиваю - в чем конкретно проблема?
Arbeit macht Fry
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
а по-твоему гугл - это только поисковая система??
третий раз говорю - покажи ссылку, где написано писать в паттерне синглтон слово статик
третий раз говорю - покажи ссылку, где написано писать в паттерне синглтон слово статик
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Остальное у него так себеFoenix писал(а):а по-твоему гугл - это только поисковая система??
Да сколько хочешь.Foenix писал(а): третий раз говорю - покажи ссылку, где написано писать в паттерне синглтон слово статик
Википедия: Синглетон на Java. Initialization on Demand Holder
На хабре: 5 примеров Синглетона, все с использованием static
http://habrahabr.ru/post/27108/
Ну и т.д.
Arbeit macht Fry
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
отлично) по-моему, это того стоило - посмотреть еще раз на ссылки)
так а для чего там статик, тут тему разные люди читают, можешь объяснить?
так а для чего там статик, тут тему разные люди читают, можешь объяснить?
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 38. Транзакции в SQLite. Небольшой FAQ по SQLite.
Ну в чем смысл синглетона - у нас объект этого класса должен иметь только одну копию. Он же инстанс. И сколько бы мы не пытались сделать его копию, она всегда должна быть одна.
Как мы это делаем в данном случае? Объевляем поле класса instance, тип этого поля - наш же класс синглетон. Его мы будем возвращать при попытке сделать инстанс нашего класса, при этом возвращаемый обект будет один и тот же. Для этого мы его делаем static, то есть значение этого поля принадлежит не отдельному объекту, а всему классу. Метод, который будет возвращать значение этого поля делаем static по той же причине.
Все это, по большому счету, способ №4 по ссылке с Хабра.
initializeInstance - это мы в сингтон передаем объект SQLiteOpenHelper для работы с БД, ради которого все и затевалось. Это фактически просто сеттер поля такой, плюс для последующей проверки, что этот сеттер был сделан.
Foenix, теперь твоя очередь. Рассказывай, в чем проблема?
Как мы это делаем в данном случае? Объевляем поле класса instance, тип этого поля - наш же класс синглетон. Его мы будем возвращать при попытке сделать инстанс нашего класса, при этом возвращаемый обект будет один и тот же. Для этого мы его делаем static, то есть значение этого поля принадлежит не отдельному объекту, а всему классу. Метод, который будет возвращать значение этого поля делаем static по той же причине.
Все это, по большому счету, способ №4 по ссылке с Хабра.
initializeInstance - это мы в сингтон передаем объект SQLiteOpenHelper для работы с БД, ради которого все и затевалось. Это фактически просто сеттер поля такой, плюс для последующей проверки, что этот сеттер был сделан.
Foenix, теперь твоя очередь. Рассказывай, в чем проблема?
Arbeit macht Fry