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

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

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

Сообщение evgenyknoblokh » 05 дек 2013, 15:03

Собственно получается:
в таблице people в поле posid пишем то или иное значение из массива position_id, которое соответствует тому или иному значению из массива position_name в поле position.

А теперь попробую еще упростить на конкретном примере:

если первое значение в массиве position_id = 1, которое соответствует первому значению в массиве position_name = "Manager", то в таблице people, для всех встречающихся строк со значением "Manager" в поле position, мы пишем в поле posid значение 1.

Во. Похоже так.

Еще долго пытался понять код

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

 void logCursor(Cursor c, String title) {
    if (c != null) {
      if (c.moveToFirst()) {
        Log.d(LOG_TAG, title + ". " + c.getCount() + " rows");
        StringBuilder sb = new StringBuilder();
        do {
          sb.setLength(0);
          for (String cn : c.getColumnNames()) {
            sb.append(cn + " = "
                + c.getString(c.getColumnIndex(cn)) + "; ");
          }
          Log.d(LOG_TAG, sb.toString());
        } while (c.moveToNext());
      }
    } else
      Log.d(LOG_TAG, title + ". Cursor is null");
  }
Но вроде бы как разобрался.
Первый вопрос был а почему используем StringBuilder.
Затем пытался понять строку

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

sb.append(cn + " = " + c.getString(c.getColumnIndex(cn)) + "; ");
Когда понял, смог ответить на первый вопрос.

Но вот открытым остался вопрос касательно:

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

sb.setLength(0);
зачем? Читал о setLength(); но не до конца понял.

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

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

Сообщение trew » 05 дек 2013, 16:14

evgenyknoblokh писал(а):Но вот открытым остался вопрос касательно:

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

sb.setLength(0);
зачем? Читал о setLength(); но не до конца понял.
Нужно читать про StringBuilder, и в чём его отличие от String. Возможно вы не смотрели, а догадывались.
А здесь идет целая борьба за рациональное использование ресурсов. :)

String st = "Маша";
String st = "";

Строка sb.setLength(0); -- это по смыслу тоже самое, что и String st = "" только для StringBuilder.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

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

Сообщение TittTitov » 17 янв 2014, 13:59

Здравствуйте!

Объясните в чем разница в записи между этим кодом:

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

db.execSQL("create table position ("
              + "id integer primary key,"
              "name text, salary integer" + ");");
И если записать так:

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

db.execSQL("create table position ("
              + "id integer primary key,"
              + "name text,"
              + "salary integer" + ");");
Спасибо!

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

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

Сообщение Foenix » 17 янв 2014, 14:49

вопрос из серии - найти 5 отличий?
убери плюсы, слей все в одну строку - какая разница? так делает редактор кода эклипс для удобства чтения длиннющих строк.
R.id.team

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

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

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

Сообщение TittTitov » 17 янв 2014, 15:21

Foenix писал(а):убери плюсы, слей все в одну строку.
Сорри, с SQL не знаком, совсем...
Т.е., поля таблицы можно объявлять просто через запятую, вот так тоже будет правильно?:

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

db.execSQL("create table position ("id integer primary key, name text, salary integer");");

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

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

Сообщение Foenix » 17 янв 2014, 15:57

я не вижу тут вопроса по sql. Это лишь строка, ты же про нее спрашиваешь?? ЧТо-то у тебя путаница возникла.
Вот мы объявляем строчку, допустим так:
String sql="create table position (id integer primary key, name text, salary integer)";
затем создаем таблицу
db.execSQL(sql);
Остались вопросы или нет?
Что значит "объявлять просто через запятую"?
у тебя же в примере было примерно так -
String sql="create table position (id integer primary key, "+
"name text, salary integer)";
т.е. я говорила - если строчка длинная, то можно ее склеить из двух, чтоб она помещалась на экране ЧИСТО ДЛЯ ЧТЕНИЯ.
В этом был вопрос?
R.id.team

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

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

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

Сообщение Foenix » 17 янв 2014, 15:58

И обрати внимание, у тебя в последнем куске кода -внутри строки String не нужны кавычки (я исправила в своем коде).
R.id.team

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

TittTitov
Сообщения: 27
Зарегистрирован: 20 ноя 2013, 22:46

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

Сообщение TittTitov » 17 янв 2014, 16:15

Foenix писал(а):внутри строки String не нужны кавычки.
Спасибо тебе огромное! Всё разложила по полочкам!
У меня возникло не понимание как работает метод execSQL.
Всё, что написал автор по этому поводу:
"В методе onCreate этого класса (DBHelper) мы используем метод execSQL объекта SQLiteDatabase для выполнения SQL-запроса, который создает таблицу" (Урок 34).
Что подаётся на вход методу нигде не сказано...
Я и подумал, что есть какие-то особые правила по которым перечисляются имя создаваемой таблицы и столбцы, а оказалось, что это просто строка...
Ещё раз, спасибо!

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

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

Сообщение Foenix » 17 янв 2014, 16:24

правильно. И не забывай, что если таблиц несколько, то каждая строка запроса к базе данных должна оканчиваться точкой с запятой.
R.id.team

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

feboll
Сообщения: 6
Зарегистрирован: 04 ноя 2013, 22:22

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

Сообщение feboll » 29 сен 2014, 01:36

Друзья, надеюсь вы мне поможете. У меня в приложении крутится база данных, которая была перенесена из готовой базы данных. Но тут возникла необходимость в её обновлении но никак не могу понять как написать метод onUpgrade.
вот код хелпера
[syntax=java]
public class DBHelper extends SQLiteOpenHelper {
public static String DB_PATH;
public static String DB_NAME;
public SQLiteDatabase database;
public final Context context;
public SQLiteDatabase getDb() {
return database;
}
public DBHelper(Context context, String databaseName) {
super(context, databaseName, null, 4);
this.context = context;
String packageName = context.getPackageName();
DB_PATH = String.format("//data//data//%s//databases//", packageName);
DB_NAME = databaseName;
openDataBase();
}
public void createDataBase() {
boolean dbExist = checkDataBase();
if (!dbExist) {
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
Log.e(this.getClass().toString(), "Copying error");
throw new Error("Error copying database!");
}
} else
Log.i(this.getClass().toString(), "Database already exists");
}
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
return dbFile.exists();
}
private void copyDataBase() throws IOException {
InputStream externalDbStream = context.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream localDbStream = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = externalDbStream.read(buffer)) > 0) {
localDbStream.write(buffer, 0, bytesRead);
}
localDbStream.close();
externalDbStream.close();
}
public SQLiteDatabase openDataBase() throws SQLException {
String path = DB_PATH + DB_NAME;
if (database == null) {
createDataBase();
database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
}
return database;
}
@Override
public synchronized void close() {
if (database != null) database.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("MyLog", " --- onUpgrade database from " + oldVersion
+ " to " + newVersion + " version --- ");
if (oldVersion == 3 && newVersion == 4) {
}
}[/syntax]
отредактированную базу я заливаю в папочку, но как с редактированной базы взять новые значения и запихнуть в существующуу на телефоне я не могу понять. надеюсь вы мне поможите

makson
Сообщения: 4
Зарегистрирован: 27 апр 2015, 21:25

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

Сообщение makson » 11 май 2015, 20:56

у меня при переносе кода из упражнения в андроид студио показывает в логах только --- Staff db v.1 ---
в чем может быть проблема)?

Ответить