Урок 34. Хранение данных. SQLite

Обсуждение уроков
Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

Re: Урок 34. Хранение данных. SQLite

Сообщение LesliStr » 17 янв 2014, 12:32

altwin писал(а):
LesliStr писал(а):День добрый. Такой вопрос. Есть два или несколько девайсов с одной и той же программой. В программе имеется база данных, но количество записей в базах на разных девайсах разное. Базы между собой синхронизировать не надо. Как передать одну или несколько записей с одного девайса на другой ? Можно использовать блитуз, вайфай, мыло, выложить запись на форуме и потом слить её на девайс и добавить в свою базу. Как эту запись передать и соответственно принять ?
Данные из записи можно достать и передать к примеру в JSON, далее вам нужно только забрать их и сформировать select, по тому же принципу, как "доставали".
Если я правильно понял, предполагается промежуточный сервак ? Сервак хотелось бы обойти. Немного уточню. В полях записи могут храниться текстовые данные, изображения, документы в формате .doc Эту запись надо достать, как-то упаковать, зашифровать и выложить в любом месте в виде файла. Другим девайсом забрать, не важно откуда, хоть с флешки, распаковать и добавить в свою базу.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Урок 34. Хранение данных. SQLite

Сообщение altwin » 17 янв 2014, 12:50

LesliStr писал(а): Если я правильно понял, предполагается промежуточный сервак ? Сервак хотелось бы обойти. Немного уточню. В полях записи могут храниться текстовые данные, изображения, документы в формате .doc Эту запись надо достать, как-то упаковать, зашифровать и выложить в любом месте в виде файла. Другим девайсом забрать, не важно откуда, хоть с флешки, распаковать и добавить в свою базу.
Нет, вы можете сериализовать JSON объект и передать по тому же bluetooth. Единственная проблема в ваших словах - "не важно откуда, и как -то". Все что вы описали - можно сделать и важно именно то, что конкретно вы хотите. Из вашего сообщения можно выделить потребность в:
  • 1. достать
    2. упаковать
    3. зашифровать
    4. выложить
    5. забрать
    6. распаковать
    7. добавить
в чем проблема?
  • 1. select запрос.
    2+3. используйте zip с паролем.
    4. выкладывайте(там, куда выкладываете - описанно как это делается у них)
    5. забирайте (там, где забираете - описанно как это делается у них)
    6. распакуйте архив
    7. insert запрос
У вас проблема с пунктами 4 и 5? ну так только потому, что как то и куда -то. Определитесь как и куда и все.
Изображение

Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

Re: Урок 34. Хранение данных. SQLite

Сообщение LesliStr » 17 янв 2014, 13:05

altwin писал(а):
LesliStr писал(а): Если я правильно понял, предполагается промежуточный сервак ? Сервак хотелось бы обойти. Немного уточню. В полях записи могут храниться текстовые данные, изображения, документы в формате .doc Эту запись надо достать, как-то упаковать, зашифровать и выложить в любом месте в виде файла. Другим девайсом забрать, не важно откуда, хоть с флешки, распаковать и добавить в свою базу.
Нет, вы можете сериализовать JSON объект и передать по тому же bluetooth. Единственная проблема в ваших словах - "не важно откуда, и как -то". Все что вы описали - можно сделать и важно именно то, что конкретно вы хотите. Из вашего сообщения можно выделить потребность в:
  • 1. достать
    2. упаковать
    3. зашифровать
    4. выложить
    5. забрать
    6. распаковать
    7. добавить
в чем проблема?
  • 1. select запрос.
    2+3. используйте zip с паролем.
    4. выкладывайте(там, куда выкладываете - описанно как это делается у них)
    5. забирайте (там, где забираете - описанно как это делается у них)
    6. распакуйте архив
    7. insert запрос
У вас проблема с пунктами 4 и 5? ну так только потому, что как то и куда -то. Определитесь как и куда и все.
Спасибо, теперь понял. Ключевое - zip. Главное сформировать файл. А уже передать и принять его можно любым доступным способом. Т.е. я могу использовать его в виде сериализованного объекта.

zloyel
Сообщения: 1
Зарегистрирован: 24 янв 2014, 23:50

Re: Урок 34. Хранение данных. SQLite

Сообщение zloyel » 24 янв 2014, 23:53

Подскажите, пожалуйста, что я неправильно делаю? Почему не создается БД?

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Kvartiry extends Activity implements OnClickListener {

final String LOG_TAG = "myLogs";

Button btnSave, btnRead, btnDelete;
EditText etName, etCity, etStreet, etHome, etKvartira, etPrice;

DBHelper dbHelper;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.kvartiry);

btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(this);

btnRead = (Button) findViewById(R.id.btnRead);
btnRead.setOnClickListener(this);

btnDelete = (Button) findViewById(R.id.btnDelete);
btnDelete.setOnClickListener(this);

etName = (EditText) findViewById(R.id.etName);
etCity = (EditText) findViewById(R.id.etCity);
etStreet = (EditText) findViewById(R.id.etStreet);
etHome = (EditText) findViewById(R.id.etHome);
etKvartira = (EditText) findViewById(R.id.etKvartira);
etPrice = (EditText) findViewById(R.id.etPrice);


// создаем объект для создания и управления версиями БД
dbHelper = new DBHelper(this);
}

@Override
public void onClick(View v) {

// создаем объект для данных
ContentValues cv = new ContentValues();

// получаем данные из полей ввода
String name = etName.getText().toString();
String city = etCity.getText().toString();
String street = etStreet.getText().toString();
String home = etHome.getText().toString();
String kvartira = etKvartira.getText().toString();
String price = etPrice.getText().toString();


// подключаемся к БД
SQLiteDatabase db = dbHelper.getWritableDatabase();

switch (v.getId()) {

case R.id.btnSave:
Log.d(LOG_TAG, "--- Insert in mytable: ---");
// подготовим данные для вставки в виде пар: наименование столбца -
// значение

cv.put("name", name);
cv.put("city", city);
cv.put("street", street);
cv.put("home", home);
cv.put("kvartira", kvartira);
cv.put("price", price);


// вставляем запись и получаем ее ID
long rowID = db.insert("mytable", null, cv);
Log.d(LOG_TAG, "row inserted, ID = " + rowID);
break;


case R.id.btnRead:
Log.d(LOG_TAG, "--- Rows in mytable: ---");
// делаем запрос всех данных из таблицы mytable, получаем Cursor
Cursor c = db.query("mytable", null, null, null, null, null, null);

// ставим позицию курсора на первую строку выборки
// если в выборке нет строк, вернется false
if (c.moveToFirst()) {

// определяем номера столбцов по имени в выборке
int idColIndex = c.getColumnIndex("id");
int nameColIndex = c.getColumnIndex("name");
int cityColIndex = c.getColumnIndex("city");
int streetColIndex = c.getColumnIndex("street");
int homeColIndex = c.getColumnIndex("home");
int kvartiraColIndex = c.getColumnIndex("kvartira");
int priceColIndex = c.getColumnIndex("price");

do {
// получаем значения по номерам столбцов и пишем все в лог
Log.d(LOG_TAG,
"ID = " + c.getInt(idColIndex) + ", name = "
+ c.getString(nameColIndex) + ", city = "
+ c.getString(cityColIndex));
// переход на следующую строку
// а если следующей нет (текущая - последняя), то false -
// выходим из цикла
} while (c.moveToNext());
} else
Log.d(LOG_TAG, "0 rows");
c.close();
break;
case R.id.btnDelete:
Log.d(LOG_TAG, "--- Clear mytable: ---");
// удаляем все записи
int clearCount = db.delete("mytable", null, null);
Log.d(LOG_TAG, "deleted rows count = " + clearCount);
break;
}
// закрываем подключение к БД
dbHelper.close();
}

class DBHelper extends SQLiteOpenHelper {

public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "--- onCreate database ---");
// создаем таблицу с полями
db.execSQL("create table mytable ("
+ "id integer primary key autoincrement," + "name text,"
+ "city text" + ");");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

}

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 34. Хранение данных. SQLite

Сообщение klblk » 27 янв 2014, 04:30

не правильно оформляешь код на форуме...

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

Re: Урок 34. Хранение данных. SQLite

Сообщение _ILYA_ » 29 янв 2014, 10:24

допустим у меня приложение с несколькими Activity. Если я создам БД в одной из них, другие Activity будут иметь к ней доступ? Ведь это все в одном приложении.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 29 янв 2014, 11:19

Будут. БД создается для всего приложения.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Урок 34. Хранение данных. SQLite

Сообщение Zeban » 30 янв 2014, 17:54

В уроке описано три способа
1) БД не существует. Это может быть например в случае первичной установки программы. В этом случае приложение должно само создать БД и все таблицы в ней. И далее оно уже работает с только что созданной БД.

2) БД существует, но ее версия устарела. Это может быть в случае обновления программы. Например новой версии программы нужны дополнительные поля в старых таблицах или новые таблицы. В этом случае приложение должно апдейтить существующие таблицы и создать новые, если это необходимо.

3) БД существует и ее версия актуальна. В этом случае приложение успешно подключается к БД и работает.
А мне нужен четвертый, где БД не существует, но она есть готовая в апк. Чтобы при установки приложения, БД просто скидывалась куда нужно, а не создавалась за счет приложения. Это возможно? и как это сделать?

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 30 янв 2014, 18:16

возможно. Сто раз на форуме это было
R.id.team

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

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Урок 34. Хранение данных. SQLite

Сообщение Zeban » 30 янв 2014, 18:17

Да тут 29 страниц, я пытался найти. Ни как ни получается( И поисковый запрос не напишешь

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 30 янв 2014, 19:32

мне поискать?
R.id.team

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 31 янв 2014, 11:42

Подсказываю ключевые слова для поиска: android база данных assets
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Isaev » 24 фев 2014, 11:55

Доброго времени суток!
Почему не срабатывает onCreate?
В комментариях к коду вопрос уточняется в нужном месте

MainActivity.java

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

public class MainActivity extends Activity {
...
  DBHelper dbHelper;
...
}

@Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

...
      dbHelper = new DBHelper(this);
      dbHelper.dbInsert(TN_SPRACHEN,myTable);
...
    }
}
DBHelper.java

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

public class DBHelper extends SQLiteOpenHelper {
  public void dbInsert(int table, ArrayList<HashMap<String,Object>> daten) {
    if(LOG) Log.d(LOG_TAG,"#### DBHelper.dbInsert ####");
    String id,pid,name,language,title,header,content;
    try {
      // создаем объект для данных
      ContentValues cv = new ContentValues();
      //Если я правильно понимаю, то при отсутствии базы данных при исполнении следующей строки должно вызываться onCreate и она создаётся... Но этого не происходит, а падает с исключением и ошибкой "unable to open database file"! ПОЧЕМУ?
      mdb = getWritableDatabase();
      ...
      mdb.insert(Tables[table], null, cv);
      mdb.close();

    } catch (SQLException e) {
      e.printStackTrace();
      Log.d(LOG_TAG, "### Datenbank existiert nicht! (\""+e.getMessage().toString()+"\")");

    }
  }

 @Override
  public void onCreate(SQLiteDatabase db) {
    Log.d(LOG_TAG,"--- onCreate database ---");
    // создаем таблицу с полями

    // Create Table 'jkSprachen'
    String SQL_CT_SPRACHE="CREATE TABLE "+Tables[TN_SPRACHEN]+" ("
            +ID+" INT, "
            +NAME+" VARCHAR(255), "
            +LANGUAGE+" VARCHAR(255))";
    try {
      db.execSQL(SQL_CT_SPRACHE);
      if(LOG) Log.d(LOG_TAG,">> # Table "+Tables[TN_SPRACHEN]+" is created: "+SQL_CT_SPRACHE+" #");
    } catch (SQLiteException e){
      if (e.getMessage().contains("already exists")){
        db.execSQL("DROP TABLE "+Tables[TN_SPRACHEN]);
        db.execSQL(SQL_CT_SPRACHE);
        if(LOG) Log.d(LOG_TAG,">> # Table "+Tables[TN_SPRACHEN]+" is reCreated: "+SQL_CT_SPRACHE+" #");
      }
    }
}
лог ошибок:

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

02-24 07:55:35.237: INFO/Database(6330): sqlite returned: error code = 14, msg = cannot open file at source line 25467
02-24 07:55:35.237: ERROR/Database(6330): sqlite3_open_v2("/data/data/com.example.Todo_List/databases/myDBank", &handle, 6, NULL) failed
02-24 07:55:35.248: WARN/System.err(6330): android.database.sqlite.SQLiteException: unable to open database file
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
02-24 07:55:35.257: WARN/System.err(6330): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)
02-24 07:55:35.257: WARN/System.err(6330): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-24 07:55:35.257: WARN/System.err(6330): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
02-24 07:55:35.257: WARN/System.err(6330): at com.example.Todo_List.DBHelper.dbInsert(DBHelper.java:140)
Если файл базы данных присутствует, хотя бы с пустыми таблицами, всё работает как часы!
в чём моя ошибка?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 34. Хранение данных. SQLite

Сообщение KamiSempai » 24 фев 2014, 22:53

Даже не представляю в чем причина. Как выглядит конструктор у хелпера?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 24 фев 2014, 23:25

а как база данных называется?
R.id.team

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

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Isaev » 25 фев 2014, 10:27

KamiSempai писал(а):Даже не представляю в чем причина. Как выглядит конструктор у хелпера?

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

  private static final String LOG_TAG = "myLogs";

  private static final String Tables[]={"jkSprachen","jkMenuLevel1","jkMenuLevel2","jkMenuLevel3"};
  private static final int DATABASE_VERSION = 1;
  private static final String DBName = "myDBank";

  public boolean LOG=false;
  SQLiteDatabase mdb;

  public DBHelper(Context context) {
    super(context,DBName,null,DATABASE_VERSION);
  }
Foenix писал(а):а как база данных называется?
myDBank
А как это связано может быть с названием? Есть какие-то ограничения на имена?
ps: а понял, из ошибки имя... Совпадает да, обявлено константой, чтобы не путать специально

Какое-то ограничение на создание файлов в эмуляторе может быть?
на v2.2 работает, стираю базу, она создаётся
на v2.3.3 если копирую базу с v2.2 всё работает, если стираю, то первоначальная ошибка
при чём в процессе работы она успешно расширяется, а вот создаться с нуля не может

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Isaev » 03 мар 2014, 14:24

Что совсем никаких идей? (

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Foenix » 03 мар 2014, 14:33

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

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

JohnnyJigsaw
Сообщения: 1
Зарегистрирован: 02 мар 2014, 14:43

Re: Урок 34. Хранение данных. SQLite

Сообщение JohnnyJigsaw » 03 мар 2014, 18:48

Здравствуйте!
Подскажите пожалуйста, как осуществить связь приложения с бд, находящейся на сервере. Например, составляется рейтинг игроков по набранным очкам, и каждый раз при достижении игроком максимального результата(рекорда) его рекорд записывается в общую таблицу игроков, и эта таблица, т.е. рейтинг видна всем. Как именно связать приложение с бд, находящейся на сервере?

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

Re: Урок 34. Хранение данных. SQLite

Сообщение Isaev » 04 мар 2014, 10:41

Foenix писал(а):я бы на твоем месте сделала бы все как в уроках - по-простому, без этих странных обработок ошибок и так далее, начать нужно сначала. А уже потом добавлять.
В уроках написано, что при отсутствии базы данных при первом обращении к ней вызывается метод onCreate в котором её и можно создать... В моём случае он не вызывается вообще, если базы данных нет, то вылезает ошибка в которой это написано, что нет её... в начале onCreate вывод в лог о его вызове, который никогда не происходит
Foenix писал(а):и проверь - на самом деле есть ли база данных или нет - с помощью эксплорера.
так проверял конечно, и написал же, что пока её нет, выходит ошибка, как только она есть, всё работает
но почему до onCreate не доходит дело, пока её нет... вот вопрос в чем

Ответить