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

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

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

Сообщение Foenix » 25 янв 2013, 15:31

Сорри, конечнор же я sqlite по привычке накатала
вот тут список есть
http://ru.wikipedia.org/wiki/Система_уп ... ами_данных
можно выбрать.
R.id.team

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

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 25 янв 2013, 15:52

Olivka писал(а):Сорри, конечнор же я sqlite по привычке накатала
вот тут список есть
http://ru.wikipedia.org/wiki/Система_уп ... ами_данных
можно выбрать.
Спасибо, за ссылку. Спрашивая здесь, я надеялся получить реальный пример использования базы. Может из собственного опыта. Мне нужна простая база, в которой будут пару столбцов для текста. И с которой приложению проще всего будет "общаться через интернет"

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

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

Сообщение Foenix » 25 янв 2013, 17:43

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

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

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 26 янв 2013, 12:02

Olivka писал(а):чтобы общаться - нужно чтобы было с кем, это вам и предлагают тут организовать вначале. иначе тогда как будет работать пример-то?
У вас реально был опыт использования базы в интернете?

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

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

Сообщение nubodroid » 26 янв 2013, 15:08

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

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

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


	db = new DBHelper(this);
	cv = new ContentValues();
		
        //	Выбор лишь тех записей, у которых parentId = 0
        sqlRes = db.getAllRecords(db.TABLE_TASKS, -1);
        
        this.startManagingCursor(sqlRes);
        
        from = new String[] { db.getColumnName() };
        to = new int[] { R.id.tvToolName_ItemTools };
        
        scAdapter = new SimpleCursorAdapter(this, R.layout.item_category, sqlRes, from, to);
        
        gv = (GridView)findViewById(R.id.gvRootCategories_LayoutActivityOrganizer);
        
        gv.setAdapter(scAdapter);
Как в массив from запихать картинки(или пути к ним)? Думал, может все это надо через...

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


        ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>(texts.length);

        for (int i = 0; i < texts.length; i++) {
        	Map<String, Object> m = new HashMap<String, Object>();
        	m.put(ATTRIBUTE_NAME, texts[i]);
        	m.put(ATTRIBUTE_IMAGE, images[i]);
        	data.add(m);
        }

        // массив имен атрибутов, из которых будут читаться данные
        String[] from = { ATTRIBUTE_NAME, ATTRIBUTE_IMAGE };
        // массив ID View-компонентов, в которые будут вставлять данные
        int[] to = { R.id.tvName_LayoutItem, R.id.ivImage_LayoutItem };
... но тут у меня два вопроса возникает
1) Каждый раз, когда я буду редактировать данные, мне надо будет снова использовать всю эту конструкцию? sqlRes.require() ведь не поможет, он только сам курсор изменит?
2) Как картинку(пусть даже путь к ней) впихнуть в массив String[] from? Т.е., строку то я впихнул, но тогда как эта строка привязывается к R.id.ivImage_LayoutItem?

Всем заранее спасибо.

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

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

Сообщение rezak90 » 26 янв 2013, 17:37

два варианта:
1) использовать тип blob;
2) в бд хранить ссылки на картинки, картинки же хранить локально как файлы.
R.id.team
Политика на форуме запрещена

nubodroid
Сообщения: 28
Зарегистрирован: 19 ноя 2012, 08:20

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

Сообщение nubodroid » 27 янв 2013, 19:07

rezak90 писал(а):два варианта:
1) использовать тип blob;
2) в бд хранить ссылки на картинки, картинки же хранить локально как файлы.
Прошу прощения, а как ссылки(вариант 2) потом привязать к адаптеру? Я пробовал запихнуть, полученные из БД пути к файлам в массив from, но в массиве to у меня R.id.очередная_картинка. И это не должно работать, да и не работает. Чтоб привязать картинку, как я понимаю, надо через src задать путь/ссылку... но... что-то никаких мыслей на счет того как это сделать. Подскажите хотя бы в какую сторону глядеть.
Еще раз заранее спасибо и сорри за нубские вопросы.

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

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

Сообщение rezak90 » 27 янв 2013, 19:39

Если с нативным адаптером то ничего не выйдет, конечно же свой нужен. В кастомный адаптер передаёте курсор, инфлейтом получаете ImageView а путь картинки вытаскиваете cursor.getString() и делаете бекграунд
R.id.team
Политика на форуме запрещена

malak
Сообщения: 3
Зарегистрирован: 21 фев 2013, 22:37

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

Сообщение malak » 21 фев 2013, 22:46

Доброго времени суток.
У меня есть некоторые трудности.
Я сделал все в точности как показано в уроке, но когда я в методе onCreate() DbHelper'а попытался создать три таблицы у меня приложение ломается на строчке с кодом

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

SQLiteDatabase db = dbHelper.getWritableDatabase();
мой кусок кода

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

@Override
	    public void onCreate(SQLiteDatabase db) {
	      Log.d(LOG_TAG, "--- onCreate database ---");
	      // создаем таблицу с полями
	      db.execSQL("create table mytable ("
	          + "id integer primary key autoincrement," 
	          + "name text,"
	          + "email text" + ");");
	    //
		    db.execSQL("CREATE TABLE table1 (" 
		    		+ "_id integer primary key autoincrement,"
		    		+ "name text,"
		    		+ "comment text,"
		    		+ "cdate text," 
		    		+ "edate text);");
		    //
		    db.execSQL("CREATE TABLE table2 (" 
		    		+ "_id integer primary key autoincrement,"
		    		+ "tid integer,"
		    		+ "etid integer,"
		    		+ "count integer,"
		    		+ "weight integer,"
		    		+ "order integer,"
		    		+ "comment text,"
		    		+ "cdate text);");
	    }
В логах никаких ошибок нет.
в чем может быть дело?
Заранее спасибо за ответы.

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

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

Сообщение rezak90 » 21 фев 2013, 22:59

лог ошибок в студию
R.id.team
Политика на форуме запрещена

malak
Сообщения: 3
Зарегистрирован: 21 фев 2013, 22:37

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

Сообщение malak » 21 фев 2013, 23:04

rezak90 писал(а):лог ошибок в студию
Под логами я имел ввиду вкладку "LogCat" в Eclipse'е
Там вообще никаких сообщений нет. Где еще можно логи посмотреть?

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

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

Сообщение rezak90 » 21 фев 2013, 23:20

у меня приложение ломается
под словом "ломается" что Вы имеет в виду? падает приложение? если да то в логе всё есть, красным цветом.
R.id.team
Политика на форуме запрещена

igor
Сообщения: 4
Зарегистрирован: 21 фев 2013, 13:12

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

Сообщение igor » 22 фев 2013, 14:10

malak писал(а):Доброго времени суток.
В логах никаких ошибок нет.
в чем может быть дело?
Заранее спасибо за ответы.
Вкладка problems, там же где и LogCat

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

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

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

Когда разбирался с sqlite в андройде наткнулся на то, что он не поддерживает множественные вставки, хотя сам sqlite судя по документации может делать INSERT множеству строк сразу. В чём дело? Типа такая особенность реализации?

malak
Сообщения: 3
Зарегистрирован: 21 фев 2013, 22:37

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

Сообщение malak » 22 фев 2013, 22:22

Я сам решил свою проблему.
попробовал отловить ошибку при помощи конструкции try{}catch{}

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

try {
	SQLiteDatabase db = dbh.getWritableDatabase();
	Log.d(LOG_TAG, "SUCCESSFUL");
	db.close();
}catch(Exception e) {
	Log.d(LOG_TAG, e.toString());
}
и в логах появилась ошибка:

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

android.database.sqlite.SQLiteException: near "order": syntax error (code 1): , while compiling: CREATE TABLE exercises (_id integer primary key autoincrement,tid integer,etid integer,count integer,weight integer,order integer,comment text,cdate text);
видимо ругался на название поля "order", которое является зарезервированным словом.
после обрамления этого слова "`"(тильда) все заработало.
проблема была в моей невнимательности.
извините за беспокойство.

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

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

Сообщение Foenix » 23 фев 2013, 02:44

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

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

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

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

Сообщение neoksi » 23 фев 2013, 08:39

Olivka писал(а):
dens писал(а):Когда разбирался с sqlite в андройде наткнулся на то, что он не поддерживает множественные вставки, хотя сам sqlite судя по документации может делать INSERT множеству строк сразу. В чём дело? Типа такая особенность реализации?
можно ссылочку на документацию, где это написано?
Тоже будет интересно почитать. Но нужно учитывать, что sqlite под android оптимизирована разработчиками ОС, и некоторые вещи могут отсутствовать для скорости работы БД.
Если требуется вставить множество данных, то я обычно открываю транзаксацию.

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

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

Сообщение rezak90 » 23 фев 2013, 09:22

а я использую орм, никаких ограничений и всё проще, надстройка сделает всё за вас при правильном её настройке.
R.id.team
Политика на форуме запрещена

gerundii
Сообщения: 8
Зарегистрирован: 23 фев 2013, 16:13

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

Сообщение gerundii » 23 фев 2013, 16:19

Помогите плз разобраться с проблемой..как работать с существующей бд..
закинул ее в asserts/db
прикладываю DBHelper и класс откуда пытаюсь получить данные из базы..


DBHelper.java :

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

public class DBHelper extends SQLiteOpenHelper{
    		
    		private static final String LOG_TAG = DBHelper.class.getName();
    		private static final String DB_NAME = "dbname";
    	    private static final String DB_FOLDER = "/data/data/package.name/databases/";
    	    private static final String DB_PATH = DB_FOLDER + DB_NAME;
    	    private static final String DB_ASSETS_PATH = "db/" + DB_NAME;
    	    private static final int DB_VERSION = 1;
    	    private static final int DB_FILES_COPY_BUFFER_SIZE = 8192;
        
    		public DBHelper(Context context) {
    		      super(context, DB_NAME, null, 1);
    		}
    
    		@Override
    	    public void onCreate(SQLiteDatabase db) {
    	        throw new SQLiteException(
    	                "Call OlimpicRaceSQLhelper.Initialize first. This method should never be called.");
    	    }
    
    	    @Override
    	    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    	        throw new SQLiteException(
    	                "Call OlimpicRaceSQLhelper.Initialize first. This method should never be called.");
    	    }
    		
    		public static void Initialize() {
    	        if (isInitialized() == false) {
    	            copyInialDBfromAssets();
    	        }
    	    }
    		
    		private static boolean isInitialized() {
    
    	        SQLiteDatabase checkDB = null;
    	        Boolean correctVersion = false;
    
    	        try {
    	            checkDB = SQLiteDatabase.openDatabase(DB_PATH, null,
    	                    SQLiteDatabase.OPEN_READONLY);
    	            correctVersion = checkDB.getVersion() == DB_VERSION;
    	        } catch (SQLiteException e) {
    	            Log.w(LOG_TAG, e.getMessage());
    	        } finally {
    	            if (checkDB != null)
    	                checkDB.close();
    	        }
    
    	        return checkDB != null && correctVersion;
    	    }
    		
    		private static void copyInialDBfromAssets() {
    
    	        Context appContext = App.getInstance().getApplicationContext();
    	        InputStream inStream = null;
    	        OutputStream outStream = null;
    
    	        try {
    	            inStream = new BufferedInputStream(appContext.getAssets().open(
    	                    DB_ASSETS_PATH), DB_FILES_COPY_BUFFER_SIZE);
    	            File dbDir = new File(DB_FOLDER);
    	            if (dbDir.exists() == false)
    	                dbDir.mkdir();
    	            outStream = new BufferedOutputStream(new FileOutputStream(DB_PATH),
    	                    DB_FILES_COPY_BUFFER_SIZE);
    
    	            byte[] buffer = new byte[DB_FILES_COPY_BUFFER_SIZE];
    	            int length;
    	            while ((length = inStream.read(buffer)) > 0) {
    	                outStream.write(buffer, 0, length);
    	            }
    
    	            outStream.flush();
    	            outStream.close();
    	            inStream.close();
    
    	        } catch (IOException ex) {
    	            // Что-то пошло не так
    	            //Log.e(LOG_TAG, ex.getMessage());
    	            //throw new ChainedSQLiteException("Fail to copy initial db from assets", ex);
    	        } finally {
    	            //IOUtils.closeSilent(outStream);
    	            //IOUtils.closeSilent(inStream);
    	        }
    	    }
    		
    	}

Main.java :

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

public class Main extends Template implements OnClickListener{
        
    	final int DIALOG_EXIT = 1;
    	private DBHelper dbHelper;
    	
    	public void onCreate(Bundle savedInstanceState) {		
        		super.onCreate(savedInstanceState);
        		setContentView(R.layout.main);
        		    		
        		dbHelper = new DBHelper(this);
        		SQLiteDatabase db = dbHelper.getWritableDatabase();
                    ...  
    	}
    
            ...
    }



ПРикладываю ошибку

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

02-23 16:46:13.945: FATAL EXCEPTION: main
    02-23 16:46:13.945: java.lang.RuntimeException: Unable to resume activity {package.name/a.b.Main}: android.database.sqlite.SQLiteException: Initialize first. This method should never be called.
    02-23 16:46:13.945: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
    02-23 16:46:13.945: 	at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
    02-23 16:46:13.945: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
    02-23 16:46:13.945: 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    02-23 16:46:13.945: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
    02-23 16:46:13.945: 	at android.os.Handler.dispatchMessage(Handler.java:99)
    02-23 16:46:13.945: 	at android.os.Looper.loop(Looper.java:130)
    02-23 16:46:13.945: 	at android.app.ActivityThread.main(ActivityThread.java:3691)
    02-23 16:46:13.945: 	at java.lang.reflect.Method.invokeNative(Native Method)
    02-23 16:46:13.945: 	at java.lang.reflect.Method.invoke(Method.java:507)
    02-23 16:46:13.945: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
    02-23 16:46:13.945: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
    02-23 16:46:13.945: 	at dalvik.system.NativeStart.main(Native Method)
    02-23 16:46:13.945: Caused by: android.database.sqlite.SQLiteException: Initialize first. This method should never be called.
    02-23 16:46:13.945: 	at a.b.DBHelper.onCreate(DBHelper.java:33)
    02-23 16:46:13.945: 	at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126)
    02-23 16:46:13.945: 	at a.b.Main.onResume(MainPage.java:71)
    02-23 16:46:13.945: 	at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
    02-23 16:46:13.945: 	at android.app.Activity.performResume(Activity.java:3858)
    02-23 16:46:13.945: 	at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2114)
    02-23 16:46:13.945: 	... 12 more
Последний раз редактировалось gerundii 23 фев 2013, 23:31, всего редактировалось 1 раз.

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

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

Сообщение Foenix » 23 фев 2013, 19:37

gerundii, скажите, вы понимаете в какой строчке ошибка?
R.id.team

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

Ответить