Урок 39. onUpgrade. Обновляем БД в SQLite
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Судя по статье на хабре http://habrahabr.ru/post/143431/ ormlite похожа на JavaEE Beans, где записи в базе представляются объектами. Подход конечно хороший, но вот комментарии к статье дали понять, что не все тут хорошо, как кажется.
rezak90, можно пару слов о личном использовании?
Я реализовал в лоб: изменил версию базы, после при проверке версии базы тащу все записи старой базы в коллекцию, адаптируя их под новую таблицу, дропаю таблицу, создаю таблицу, даю дальше работать программе. Из недостатков: лишний код. Ну не по фен шую вся эта хренотень, блин.
rezak90, можно пару слов о личном использовании?
Я реализовал в лоб: изменил версию базы, после при проверке версии базы тащу все записи старой базы в коллекцию, адаптируя их под новую таблицу, дропаю таблицу, создаю таблицу, даю дальше работать программе. Из недостатков: лишний код. Ну не по фен шую вся эта хренотень, блин.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
что именно интересует? использую орм так как он удобней, кинул ему объект и он записал его в базу. Работает быстрее чем SQLite. OpenHelperManager (аналог SQLiteOpenHelper) как правило делается синглтоном что дает доступ к бд с любого места.
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Доброе время суток.
У меня созрел вот такой вопрос по обновлению SQLite. Если в процессе разработки возникает необходимость изменить структуру БД, то как правильно это сделать (не прописывать же изменение данных через update если, нет необходимости хранить данные). А после создания ИБ метод onCreate DBHelper'a уже не отрабатывает. Заранее спасибо за ответ.
У меня созрел вот такой вопрос по обновлению SQLite. Если в процессе разработки возникает необходимость изменить структуру БД, то как правильно это сделать (не прописывать же изменение данных через update если, нет необходимости хранить данные). А после создания ИБ метод onCreate DBHelper'a уже не отрабатывает. Заранее спасибо за ответ.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
как можно обновить(заменить) даные в таблице используя файл csv?
этот файл уже на андроиде.
этот файл уже на андроиде.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Подниму вопрос!
заполнить таблицу на андроиде новыми данными,
сделал так
переслал строку с
insert ....... value()
insert ....... value()
...
сплитом разбил её на отдельные строки-инсерты и в цикле их выполняю.
работает, но очень долго, хотя данных не много, не бльше 200, гарантированно.
как можно ускорить?
в mysql можно напрямую загрузить из файла, (файл могу сформировать любой)
а как в SQLite?
подключаться напрямую к внешней базе не вариант.
заполнить таблицу на андроиде новыми данными,
сделал так
переслал строку с
insert ....... value()
insert ....... value()
...
сплитом разбил её на отдельные строки-инсерты и в цикле их выполняю.
работает, но очень долго, хотя данных не много, не бльше 200, гарантированно.
как можно ускорить?
в mysql можно напрямую загрузить из файла, (файл могу сформировать любой)
а как в SQLite?
подключаться напрямую к внешней базе не вариант.
Re: Урок 39. onUpgrade. Обновляем БД в 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: Урок 39. onUpgrade. Обновляем БД в SQLite
не думал, что это так критично...Foenix писал(а):Нужно делать это в одной транзакции
Спасибо.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Подскажите пллз на примитивном примере как можно просто добавить в новой версии приложения данные в таблицу, не меняя ее структуры...Заранее спасибо
Re: Урок 39. onUpgrade. Обновляем БД в 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: Урок 39. onUpgrade. Обновляем БД в SQLite
я к тому что это нужно делать также через OnUpgrade?
Re: Урок 39. onUpgrade. Обновляем БД в 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: Урок 39. onUpgrade. Обновляем БД в SQLite
Подскажите плзз..
получаю ошибку на строке
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
Код: Выделить всё
public class DBHelper extends SQLiteOpenHelper{
private static String DB_PATH = app_dir+"/databases/";
private static String DB_NAME = "db.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
public DBHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
}else{
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
private void copyDataBase() throws IOException{
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
}
@Override
public synchronized void close() {
if(myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
получаю ошибку на строке
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
Код: Выделить всё
09-20 23:33:47.765: E/Database(29687): sqlite3_open_v2("*/db.sqlite", &handle, 1, NULL) failed
Re: Урок 39. onUpgrade. Обновляем БД в 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: Урок 39. onUpgrade. Обновляем БД в SQLite
так естесственно (в assets)..вообще на самом деле час назад все работало)а потом вот чтото сломалось
+ к ошибке
+ к ошибке
Код: Выделить всё
09-20 23:53:12.515: E/AndroidRuntime(31668): FATAL EXCEPTION: main
09-20 23:53:12.515: E/AndroidRuntime(31668): java.lang.RuntimeException: Unable to start activity ComponentInfo{app.package.MainPage}: android.database.sqlite.SQLiteException: unable to open database file
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.os.Handler.dispatchMessage(Handler.java:99)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.os.Looper.loop(Looper.java:130)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread.main(ActivityThread.java:3691)
09-20 23:53:12.515: E/AndroidRuntime(31668): at java.lang.reflect.Method.invokeNative(Native Method)
09-20 23:53:12.515: E/AndroidRuntime(31668): at java.lang.reflect.Method.invoke(Method.java:507)
09-20 23:53:12.515: E/AndroidRuntime(31668): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
09-20 23:53:12.515: E/AndroidRuntime(31668): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
09-20 23:53:12.515: E/AndroidRuntime(31668): at dalvik.system.NativeStart.main(Native Method)
09-20 23:53:12.515: E/AndroidRuntime(31668): Caused by: android.database.sqlite.SQLiteException: unable to open database file
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1990)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:905)
09-20 23:53:12.515: E/AndroidRuntime(31668): at app.package.DBHelper.openDataBase(DBHelper.java:78)
09-20 23:53:12.515: E/AndroidRuntime(31668): at app.package.MainHelper.openDatabase(MainHelper.java:326)
09-20 23:53:12.515: E/AndroidRuntime(31668): at app.package.MainPage.onCreate(MainPage.java:77)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-20 23:53:12.515: E/AndroidRuntime(31668): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
09-20 23:53:12.515: E/AndroidRuntime(31668): ... 11 more
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Разобрался..все работает..дело было не в хелпере бд )
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Для браузера Mozilla Firefox, оказывается есть плагин SQLite
https://addons.mozilla.org/En-us/firefo ... e-manager/
т.е. устанавливаем, и работаем с базой через интерфейс браузера.
А когда создали/отредактировали на локальном компе базу, можно выложить её в проект Android.
(в меню браузера, закладка -Инструменты- SQLite Manager)
https://addons.mozilla.org/En-us/firefo ... e-manager/
т.е. устанавливаем, и работаем с базой через интерфейс браузера.
А когда создали/отредактировали на локальном компе базу, можно выложить её в проект Android.
(в меню браузера, закладка -Инструменты- SQLite Manager)
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
мне система предлагает использовать вместо:
использовать такую конструкцию:
аргументируя это String concatenation as argument to 'StringBuilder.append()' call
что в общем то вполне логично
Код: Выделить всё
sb.append(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
Код: Выделить всё
sb.append(cn).append(" = ").append(c.getString(c.getColumnIndex(cn))).append(";");
что в общем то вполне логично
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
До конца не понятно, что заставляет поменять номер версии базы?
Я так подозреваю, что номер версии неявно присваивается значение newVersion при вызове onUpgrade, а подтвержается он вмсесте со всеми измененными данными при вызове setTransactionSuccessful. То есть при отказе версия откатывается вместе с изменениями?
Я так подозреваю, что номер версии неявно присваивается значение newVersion при вызове onUpgrade, а подтвержается он вмсесте со всеми измененными данными при вызове setTransactionSuccessful. То есть при отказе версия откатывается вместе с изменениями?
-
- Сообщения: 2
- Зарегистрирован: 05 дек 2013, 00:39
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Для меня этот урок оказался одним из самых сложных, не считая первые уроки посвященные sqlite.
Собственно до сих пор в некотором недоумении от следующего куска кода:
for (int k = 0; k < position_id.length; k++){
cv.clear();
cv.put("posid", position_id[k]);
db.update("people", cv, "position = ?", new String[] {position_name[k]});
}
Я понимаю, что здесь ничего сложного, но в голове очень тяжело укладывается.
По факту строка
db.update("people", cv, "position = ?", new String[] {position_name[k]});
должна делать следующее:
если в таблице people position есть значение из массива position_name, то для этой строки установить в качестве значения поля posid значение из массива position_id
так?
А может кто-нить сказать более человеческим языком, что делает эта строка?
Собственно до сих пор в некотором недоумении от следующего куска кода:
for (int k = 0; k < position_id.length; k++){
cv.clear();
cv.put("posid", position_id[k]);
db.update("people", cv, "position = ?", new String[] {position_name[k]});
}
Я понимаю, что здесь ничего сложного, но в голове очень тяжело укладывается.
По факту строка
db.update("people", cv, "position = ?", new String[] {position_name[k]});
должна делать следующее:
если в таблице people position есть значение из массива position_name, то для этой строки установить в качестве значения поля posid значение из массива position_id
так?
А может кто-нить сказать более человеческим языком, что делает эта строка?
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
evgenyknoblokh писал(а): for (int k = 0; k < position_id.length; k++){
cv.clear();
cv.put("posid", position_id[k]);
db.update("people", cv, "position = ?", new String[] {position_name[k]});
}
Код: Выделить всё
db.update("people", cv, "position = ?", new String[] {position_name[k]});
Теперь разбираемся как он происходит:
cv.put("posid", position_id[k]);
эта строка, в update, для поля "posid" устанавливает значение из массива position_id[k]
т.е. происходит update только одного поля (если будет несколько строк cv.put() - обновлять будем несколько столбцов в таблице).
Теперь для update нужно написать условие WHERE, что будем обновлять (какие строки). Пишем, где "position = ?"
Зачем здесь нужен массив new String[] {position_name[k]} ?
Это для того, чтобы можно было передать несколько значений.
Пример:
Код: Выделить всё
String[] args = new String[]{"user1", "user2"};
db.update("YOUR_TABLE", newValues, "name1=? OR name2=?", args);
Всё это можно написать на SQL:
Код: Выделить всё
db.execSQL("UPDATE people SET YOUR_COLUMN='newValue' WHERE id=2");
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.
Свои сообщения можно редактировать - кнопка edit.