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

Обсуждение уроков
Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

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

Сообщение Xroft » 10 май 2012, 21:06

damager82 писал(а):
Xroft писал(а):Во первых, огромное спасибо за написанные уроки!!!
Уже неделю не вылезаю с вашего сайта!!! ТАК ДЕРЖАТЬ!)

Просило " Remove '@Override' annotation " Что я сделал и запустил приложение.
Спасибо )

У вас наверно 7-я версия Java, она ругается на Ovveride - viewtopic.php?f=3&t=117&p=149#p150
Я на шестой сижу, и иногда забываю удалять эту аннотацию из кода.
По поводу @Override понял, обновлю ... но проблема не в этом, проблема при запуске на эмуле, а именно вместо запуска приложения ошибка - The application P0341_SimpleSQLite (process ru.startandroid.develop.p0341simplesqlite) has stoppet unexpectedly. Please try again

что это за зверь и как с ней бороться?

логи
[2012-05-11 02:34:46 - P0341_SimpleSQLite] Uploading P0341_SimpleSQLite.apk onto device 'emulator-5554'
[2012-05-11 02:34:47 - P0341_SimpleSQLite] Installing P0341_SimpleSQLite.apk...
[2012-05-11 02:36:54 - P0341_SimpleSQLite] Success!
[2012-05-11 02:36:54 - P0341_SimpleSQLite] Failed to install P0341_SimpleSQLite.apk on device 'emulator-5554': device not found
[2012-05-11 02:36:54 - P0341_SimpleSQLite] com.android.ddmlib.InstallException: device not found

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 14 май 2012, 09:04

Xroft писал(а): логи
[2012-05-11 02:34:46 - P0341_SimpleSQLite] Uploading P0341_SimpleSQLite.apk onto device 'emulator-5554'
[2012-05-11 02:34:47 - P0341_SimpleSQLite] Installing P0341_SimpleSQLite.apk...
[2012-05-11 02:36:54 - P0341_SimpleSQLite] Success!
[2012-05-11 02:36:54 - P0341_SimpleSQLite] Failed to install P0341_SimpleSQLite.apk on device 'emulator-5554': device not found
[2012-05-11 02:36:54 - P0341_SimpleSQLite] com.android.ddmlib.InstallException: device not found
Вообще похоже, что у вас просто эмулятор не подцепляется. А остальные приложение запускаются?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

gaydamaka
Сообщения: 2
Зарегистрирован: 01 июн 2012, 14:25

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

Сообщение gaydamaka » 01 июн 2012, 14:35

Здравствуйте, у меня возникла проблема. В логи выдает "row inserted, ID = -1". Код вроде тот-же, в чем проблема не понимаю. Может БД не создается?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 04 июн 2012, 10:55

gaydamaka писал(а):Здравствуйте, у меня возникла проблема. В логи выдает "row inserted, ID = -1". Код вроде тот-же, в чем проблема не понимаю. Может БД не создается?
А файл базы создается? Я в конце урока написал, как его можно найти.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

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

Сообщение Xroft » 04 июн 2012, 20:05

Прошу прощенья. Это я тормозил... снялся с ручника и все заработало))

diron
Сообщения: 2
Зарегистрирован: 17 июн 2012, 09:43

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

Сообщение diron » 17 июн 2012, 12:24

Подскажите, а есть какое-нибудь средство, для отладки запросов SQLite? Например, хотелось бы попробовать выполнить запрос в IDE Eclipse... а то не всегда понятно, на что ругается приложение.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 18 июн 2012, 09:15

diron писал(а):Подскажите, а есть какое-нибудь средство, для отладки запросов SQLite? Например, хотелось бы попробовать выполнить запрос в IDE Eclipse... а то не всегда понятно, на что ругается приложение.
Есть прога sqlitebrowser. Можно скинуть файл базы данных на комп и там повыполнять запросы.
Про встроенный в Eclipse отладчик я не слышал.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

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

Сообщение Xroft » 21 июн 2012, 17:56

diron писал(а):Подскажите, а есть какое-нибудь средство, для отладки запросов SQLite? Например, хотелось бы попробовать выполнить запрос в IDE Eclipse... а то не всегда понятно, на что ругается приложение.
SQLite Expert Personal

Удобная и мощная штука, может все.

perelygin
Сообщения: 4
Зарегистрирован: 24 июн 2012, 20:54

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

Сообщение perelygin » 24 июн 2012, 21:01

добрый день. Спасибо за уроки. Не первый источник по андроиду, но на текущий момент лучший!

Скажите, а есть ли возможность хранить в SQLite файлы изображений?
У класса ContentValues вроде как нет метода put с параметрами blob

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

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

Сообщение rezak90 » 28 июн 2012, 13:12

не могу понять почему выскакивает SQLiteException на строке:
long rowID = db.insert(NAME_TABLE, null, cv);
06-28 12:27:34.650: I/dalvikvm(1209): threadid=3: reacting to signal 3
06-28 12:27:34.660: I/dalvikvm(1209): Wrote stack traces to '/data/anr/traces.txt'
06-28 12:27:34.890: D/gralloc_goldfish(1209): Emulator without GPU emulation detected.
06-28 12:27:39.990: I/SqliteDatabaseCpp(1209): sqlite returned: error code = 1, msg = no such table: image, db=/data/data/titov.mytest.namespace/databases/rss
06-28 12:27:40.020: E/SQLiteDatabase(1209): Error inserting _id=0 name=/data/data/titov.mutest.namespace/files/foxnews.jpg
06-28 12:27:40.020: E/SQLiteDatabase(1209): android.database.sqlite.SQLiteException: no such table: image: , while compiling: INSERT INTO image(_id,name) VALUES (?,?)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at titov.mytest.namespace.RssListActivity.createDataBase(RssListActivity.java:54)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at titov.mytest.namespace.RssListActivity.init(RssListActivity.java:37)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at titov.mytest.namespace.RssListActivity.onCreate(RssListActivity.java:28)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.Activity.performCreate(Activity.java:4465)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.widget.TabHost.setCurrentTab(TabHost.java:346)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.view.View.performClick(View.java:3511)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.view.View$PerformClick.run(View.java:14105)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.os.Handler.handleCallback(Handler.java:605)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.os.Handler.dispatchMessage(Handler.java:92)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.os.Looper.loop(Looper.java:137)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at java.lang.reflect.Method.invoke(Method.java:511)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-28 12:27:40.020: E/SQLiteDatabase(1209): at dalvik.system.NativeStart.main(Native Method)
06-28 12:27:40.020: D/MyTag(1209): row inserted, ID = -1
не может найти таблицу с названием image, првоерил в эмуляторе файл базы создаётся и не пустой, что то ж так создаётся, но почему при вставке данных не находит таблицу?

Вот код:

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

import java.util.ArrayList;

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.widget.ListView;

public class RssListActivity extends Activity {

	private ArrayList<RssItem> items = new ArrayList<RssItem>();
	private RssAdapter adapter;
	private DBHelper dbHelper;
	public SQLiteDatabase db;
	public static final String NAME_DATABASE = "rss", NAME_TABLE = "image",
			NAME_ID_COLUMN = "_id", NAME_NAME_COLUMN = "name", IMAGE_PATH = "/data/data/titov.mutest.namespace/files/foxnews.jpg",
			CREATE_TABLE = "CREATE TABLE " + NAME_TABLE + " (" + NAME_ID_COLUMN + " INTEGER PRImARY KEY AUTOINCREMENT, " + NAME_NAME_COLUMN + " TEXT);";
	
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.my_list);
	    init();
	}
	
	public void init() {
		/*items.add(new RssItem(R.drawable.bbc));
		items.add(new RssItem(R.drawable.eurosportnews));
		items.add(new RssItem(R.drawable.foxnews));
		items.add(new RssItem(R.drawable.skynews));*/
		dbHelper = new DBHelper(RssListActivity.this);
		createDataBase();
		//readOfDataBase();
		adapter = new RssAdapter(this, items);
		ListView lvMain = (ListView) findViewById(R.id.lvMain);
		lvMain.setAdapter(adapter);
	}
	
	public void createDataBase() {
		try {
		// создаем объект для данных
		ContentValues cv = new ContentValues();
		// подключаемся к БД
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		// подготовим данные для вставки в виде пар: наименование столбца - значение
		//cv.put(NAME_ID_COLUMN, "0");
		cv.put(NAME_NAME_COLUMN, IMAGE_PATH);
		// вставляем запись и получаем ее ID
		long rowID = db.insert(NAME_TABLE, null, cv);
		Log.d("MyTag", "row inserted, ID = " + rowID);
		} catch(Exception e) {
			Log.i("MyTag", "create or insert");
			e.printStackTrace();
		}
	}
	
	public void readOfDataBase() {
		dbHelper = new DBHelper(this);
		//ContentValues cv = new ContentValues();
		//SQLiteDatabase db = dbHelper.getWritableDatabase();
		Cursor c = db.query(NAME_TABLE, null, null, null, null, null, null);
		// ставим позицию курсора на первую строку выборки
	    // если в выборке нет строк, вернется false
		if (c.moveToFirst()) {
			// определяем номера столбцов по имени в выборке
			int idColIndex = c.getColumnIndex(NAME_ID_COLUMN);
			int nameColIndex = c.getColumnIndex(NAME_NAME_COLUMN);
			do {
				// получаем значения по номерам столбцов и пишем все в лог
				items.add(new RssItem(c.getString(nameColIndex)));
			} while (c.moveToNext());
		}
		else
	        Log.d("MyTag", "0 rows");
		
	}
	
	class DBHelper extends SQLiteOpenHelper {
		
		public DBHelper(Context context) {
			super(context, NAME_DATABASE, null, 1);
		}
		
		public void onCreate(SQLiteDatabase arg0) {
			try{
			// создаем таблицу с полями
			db.execSQL(CREATE_TABLE);
			} catch(Exception e) {
				Log.i("myTag", "create in create class");
				e.printStackTrace();
			}
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub

		}

	}
}
Последний раз редактировалось rezak90 28 июн 2012, 15:34, всего редактировалось 1 раз.
R.id.team
Политика на форуме запрещена

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

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

Сообщение brucemax » 28 июн 2012, 14:09

damager82 писал(а):А метод onCreate точно срабатывает?
Может пытаетесь в ранее созданную базу запись вставлять. Попробуйте удалить файл базы данных, пусть заново создаст.
А как удалить файл базы данных?

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

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

Сообщение KamiSempai » 28 июн 2012, 16:00

brucemax писал(а):А как удалить файл базы данных?
Файлы баз лежат в папке "/data/data/<Название Вашего пакета>/databases/
Можно удалить их через проводник с рут правами или программно.
Также файлы баз данных удаляются при удалении приложения.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

htk
Сообщения: 5
Зарегистрирован: 10 июл 2012, 10:09

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

Сообщение htk » 10 июл 2012, 10:18

perelygin писал(а):добрый день. Спасибо за уроки. Не первый источник по андроиду, но на текущий момент лучший!

Скажите, а есть ли возможность хранить в SQLite файлы изображений?
У класса ContentValues вроде как нет метода put с параметрами blob
Вообще хранить изображения в SQLite не рекомендуется её разработчиками, вместо этого лучше хранить там путь к файлам. А насчет ContentValues для работы с БД в Андроид не обязательно использовать данный класс в принципе (и довольно часто это выгоднее), при помощи метода execSQL можно использовать обычные SQL запросы в обход вспомогательных методов и таким образом хранить в БД и извлекать из неё любые данные из разрешенных СУБД. Да и класс Cursor имеет метод getBlob. :D

newbie
Сообщения: 1
Зарегистрирован: 18 июл 2012, 01:14

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

Сообщение newbie » 18 июл 2012, 01:26

Здравствуйте. Не знаю, совсем туда ли написал, но все же.
У меня есть заполненный ArrayList. Как эти данные из ArrayList передать в БД, никак не могу разобраться :oops: :(

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

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

Сообщение rezak90 » 18 июл 2012, 11:21

newbie, написал на быструю руку, думаю всё понятно, ничего сложного тута нету.

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

public class MyClass {
   private int x;
   private String word;
   public MyClass(int _x, String _word) {
      x = _x;
      word = _word;
   }
   public int getX() {
      return x;
   }
   public String getWord() {
      return word;
   }
}
//insert in database
private void insert() {
   ArrayList list = new ArrayList();
   list.add(5, "hello");
   list.add(5, "world");
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   DBHelper dbHelper = new DBHelper(this);
   try {
      ContentValues cv = new ContentValues();
      for(int i = 0; i < list.size(); i++) {
         cv.put("x", list.get(i).getX());
         cv.put("word", list.get(i).getWord());
         long rowID = db.insert("matable", null, cv);
         if(rowID == -1)
            throw new Exception("error in insert to database");
      }
   } catch(Exception) { dbHelper.close(); }
   dbHelper.close();
}
R.id.team
Политика на форуме запрещена

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 18 июл 2012, 11:44

Ошибки в коде. И лучше использовать транзакции - без транзакций вставка идёт медленно.

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

private void insert() {
   ArrayList<MyClass> list = new ArrayList<MyClass>();
   list.add(new MyClass(5, "hello"));
   list.add(new MyClass(5, "world"));
   DBHelper dbHelper = new DBHelper(this);
   SQLiteDatabase db = dbHelper.getWritableDatabase();
   db.beginTransaction();
   try {
      try {
      ContentValues cv = new ContentValues();

      for(int i = 0; i < list.size(); i++) {
         cv.put("x", list.get(i).getX());
         cv.put("word", list.get(i).getWord());
         long rowID = db.insert("matable", null, cv);
         if(rowID == -1)
            throw new Exception("error in insert to database");
      }
      } catch(Exception) { dbHelper.close(); }
      db.setTransactionSuccessful();
   } finally {
      db.endTransaction();
   }
   db.close();
   dbHelper.close();
}

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

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

Сообщение rezak90 » 18 июл 2012, 12:57

да ошибки увидил, но придупредил что они могут быть так как код не проверял и написал сразу тута его. Думаю для ТС'a главный кусок кода это цикл в котором идёт вставка в бд.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Alexander-89
Сообщения: 2
Зарегистрирован: 19 июл 2012, 18:41
Откуда: UA
Контактная информация:

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

Сообщение Alexander-89 » 19 июл 2012, 18:43

А можно из разных приложений сохранять данный в одну таблицу ?

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 19 июл 2012, 18:46

Можно. Но сохранять на флешке. (Третье сообщение в данной ветке)
Не забудь добавить <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> в манифест.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

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

Сообщение damager82 » 20 июл 2012, 09:15

Alexander-89 писал(а):А можно из разных приложений сохранять данный в одну таблицу ?
Можно еще Content Provider наваять
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить