Страница 2 из 3
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 31 янв 2013, 10:38
Mikhail_dev
Судя по статье на хабре
http://habrahabr.ru/post/143431/ ormlite похожа на JavaEE Beans, где записи в базе представляются объектами. Подход конечно хороший, но вот комментарии к статье дали понять, что не все тут хорошо, как кажется.
rezak90, можно пару слов о личном использовании?
Я реализовал в лоб: изменил версию базы, после при проверке версии базы тащу все записи старой базы в коллекцию, адаптируя их под новую таблицу, дропаю таблицу, создаю таблицу, даю дальше работать программе. Из недостатков: лишний код. Ну не по фен шую вся эта хренотень, блин.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 31 янв 2013, 21:52
rezak90
что именно интересует? использую орм так как он удобней, кинул ему объект и он записал его в базу. Работает быстрее чем SQLite. OpenHelperManager (аналог SQLiteOpenHelper) как правило делается синглтоном что дает доступ к бд с любого места.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 26 фев 2013, 19:22
Alex_sh
Доброе время суток.
У меня созрел вот такой вопрос по обновлению SQLite. Если в процессе разработки возникает необходимость изменить структуру БД, то как правильно это сделать (не прописывать же изменение данных через update если, нет необходимости хранить данные). А после создания ИБ метод onCreate DBHelper'a уже не отрабатывает. Заранее спасибо за ответ.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 13 сен 2013, 18:17
assan
как можно обновить(заменить) даные в таблице используя файл csv?
этот файл уже на андроиде.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 11:53
assan
Подниму вопрос!
заполнить таблицу на андроиде новыми данными,
сделал так
переслал строку с
insert ....... value()
insert ....... value()
...
сплитом разбил её на отдельные строки-инсерты и в цикле их выполняю.
работает, но очень долго, хотя данных не много, не бльше 200, гарантированно.
как можно ускорить?
в mysql можно напрямую загрузить из файла, (файл могу сформировать любой)
а как в SQLite?
подключаться напрямую к внешней базе не вариант.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 12:02
Foenix
Нужно делать это в одной транзакции
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 13:41
assan
Foenix писал(а):Нужно делать это в одной транзакции
не думал, что это так критично...
Спасибо.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 21:20
gerundii1
Подскажите пллз на примитивном примере как можно просто добавить в новой версии приложения данные в таблицу, не меняя ее структуры...Заранее спасибо
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 21:32
Foenix
Что-то ты не так говоришь. При добавлении данных в таблицу - структура не изменяется.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 21:42
gerundii1
я к тому что это нужно делать также через OnUpgrade?
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 21:53
Foenix
т.е. просто добавить данные в таблицу (например, парочку самых первых записей?) КОнечно, нужно и в онкриэйт и онапгрейд вписывать это. Т.е. два раза.
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 22:34
gerundii1
Подскажите плзз..
Код: Выделить всё
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
Добавлено: 20 сен 2013, 22:48
Foenix
а у тебя эта база, которую ты пытаешься копировать, есть в наличии-то?
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 20 сен 2013, 22:50
gerundii1
так естесственно (в 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
Добавлено: 20 сен 2013, 23:33
gerundii1
Разобрался..все работает..дело было не в хелпере бд )
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 07 окт 2013, 10:30
trew
Для браузера Mozilla Firefox, оказывается есть плагин SQLite
https://addons.mozilla.org/En-us/firefo ... e-manager/
т.е. устанавливаем, и работаем с базой через интерфейс браузера.
А когда создали/отредактировали на локальном компе базу, можно выложить её в проект Android.
(в меню браузера, закладка -Инструменты- SQLite Manager)
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 17 окт 2013, 12:26
Isaev
мне система предлагает использовать вместо:
Код: Выделить всё
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
что в общем то вполне логично
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 27 окт 2013, 13:15
Wp8Lover
До конца не понятно, что заставляет поменять номер версии базы?
Я так подозреваю, что номер версии неявно присваивается значение newVersion при вызове onUpgrade, а подтвержается он вмсесте со всеми измененными данными при вызове setTransactionSuccessful. То есть при отказе версия откатывается вместе с изменениями?
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 05 дек 2013, 00:58
evgenyknoblokh
Для меня этот урок оказался одним из самых сложных, не считая первые уроки посвященные 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
так?
А может кто-нить сказать более человеческим языком, что делает эта строка?
Re: Урок 39. onUpgrade. Обновляем БД в SQLite
Добавлено: 05 дек 2013, 12:09
trew
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");