Урок 39. onUpgrade. Обновляем БД в SQLite

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Mikhail_dev » 31 янв 2013, 10:38

Судя по статье на хабре http://habrahabr.ru/post/143431/ ormlite похожа на JavaEE Beans, где записи в базе представляются объектами. Подход конечно хороший, но вот комментарии к статье дали понять, что не все тут хорошо, как кажется.
rezak90, можно пару слов о личном использовании?
Я реализовал в лоб: изменил версию базы, после при проверке версии базы тащу все записи старой базы в коллекцию, адаптируя их под новую таблицу, дропаю таблицу, создаю таблицу, даю дальше работать программе. Из недостатков: лишний код. Ну не по фен шую вся эта хренотень, блин.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение rezak90 » 31 янв 2013, 21:52

что именно интересует? использую орм так как он удобней, кинул ему объект и он записал его в базу. Работает быстрее чем SQLite. OpenHelperManager (аналог SQLiteOpenHelper) как правило делается синглтоном что дает доступ к бд с любого места.
R.id.team
Политика на форуме запрещена

Alex_sh
Сообщения: 9
Зарегистрирован: 04 фев 2013, 12:10

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Alex_sh » 26 фев 2013, 19:22

Доброе время суток.
У меня созрел вот такой вопрос по обновлению SQLite. Если в процессе разработки возникает необходимость изменить структуру БД, то как правильно это сделать (не прописывать же изменение данных через update если, нет необходимости хранить данные). А после создания ИБ метод onCreate DBHelper'a уже не отрабатывает. Заранее спасибо за ответ.

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение assan » 13 сен 2013, 18:17

как можно обновить(заменить) даные в таблице используя файл csv?
этот файл уже на андроиде.

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение assan » 20 сен 2013, 11:53

Подниму вопрос!
заполнить таблицу на андроиде новыми данными,
сделал так
переслал строку с
insert ....... value()
insert ....... value()
...
сплитом разбил её на отдельные строки-инсерты и в цикле их выполняю.
работает, но очень долго, хотя данных не много, не бльше 200, гарантированно.
как можно ускорить?
в mysql можно напрямую загрузить из файла, (файл могу сформировать любой)
а как в SQLite?
подключаться напрямую к внешней базе не вариант.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Foenix » 20 сен 2013, 12:02

Нужно делать это в одной транзакции
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение assan » 20 сен 2013, 13:41

Foenix писал(а):Нужно делать это в одной транзакции
не думал, что это так критично...
Спасибо.

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение gerundii1 » 20 сен 2013, 21:20

Подскажите пллз на примитивном примере как можно просто добавить в новой версии приложения данные в таблицу, не меняя ее структуры...Заранее спасибо

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Foenix » 20 сен 2013, 21:32

Что-то ты не так говоришь. При добавлении данных в таблицу - структура не изменяется.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение gerundii1 » 20 сен 2013, 21:42

я к тому что это нужно делать также через OnUpgrade?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Foenix » 20 сен 2013, 21:53

т.е. просто добавить данные в таблицу (например, парочку самых первых записей?) КОнечно, нужно и в онкриэйт и онапгрейд вписывать это. Т.е. два раза.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение gerundii1 » 20 сен 2013, 22:34

Подскажите плзз..

Код: Выделить всё

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Foenix » 20 сен 2013, 22:48

а у тебя эта база, которую ты пытаешься копировать, есть в наличии-то?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение gerundii1 » 20 сен 2013, 22:50

так естесственно (в 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

gerundii1
Сообщения: 7
Зарегистрирован: 20 сен 2013, 21:16

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение gerundii1 » 20 сен 2013, 23:33

Разобрался..все работает..дело было не в хелпере бд )

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение trew » 07 окт 2013, 10:30

Для браузера Mozilla Firefox, оказывается есть плагин SQLite
https://addons.mozilla.org/En-us/firefo ... e-manager/
т.е. устанавливаем, и работаем с базой через интерфейс браузера.
А когда создали/отредактировали на локальном компе базу, можно выложить её в проект Android.
(в меню браузера, закладка -Инструменты- SQLite Manager)
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Isaev » 17 окт 2013, 12:26

мне система предлагает использовать вместо:

Код: Выделить всё

sb.append(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
использовать такую конструкцию:

Код: Выделить всё

sb.append(cn).append(" = ").append(c.getString(c.getColumnIndex(cn))).append(";");
аргументируя это String concatenation as argument to 'StringBuilder.append()' call
что в общем то вполне логично

Wp8Lover
Сообщения: 5
Зарегистрирован: 27 окт 2013, 13:05

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение Wp8Lover » 27 окт 2013, 13:15

До конца не понятно, что заставляет поменять номер версии базы?
Я так подозреваю, что номер версии неявно присваивается значение newVersion при вызове onUpgrade, а подтвержается он вмсесте со всеми измененными данными при вызове setTransactionSuccessful. То есть при отказе версия откатывается вместе с изменениями?

evgenyknoblokh
Сообщения: 2
Зарегистрирован: 05 дек 2013, 00:39

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение evgenyknoblokh » 05 дек 2013, 00:58

Для меня этот урок оказался одним из самых сложных, не считая первые уроки посвященные 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

так?

А может кто-нить сказать более человеческим языком, что делает эта строка?

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 39. onUpgrade. Обновляем БД в SQLite

Сообщение trew » 05 дек 2013, 12:09

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]});
Есть таблица "people", для которой происходит update.

Теперь разбираемся как он происходит:
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);
Здесь знаки вопроса заменяются на значения "user1", "user2".

Всё это можно написать на SQL:

Код: Выделить всё

db.execSQL("UPDATE people SET YOUR_COLUMN='newValue' WHERE id=2");
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Ответить