Урок 136. CursorLoader

Обсуждение уроков
Аватара пользователя
Akella
Сообщения: 42
Зарегистрирован: 05 ноя 2013, 12:55
Откуда: UA
Контактная информация:

Re: Урок 136. CursorLoader

Сообщение Akella » 09 янв 2014, 01:12

>>и что есть натуральный ключ?

имеется ввиду, что есть понятия ключей: естественный и суррогатный
иногда не имеет смысла создавать целочисленное поле "ID", когда есть текстовое поле "NAME", которое предполагается быть уникальным

Аватара пользователя
Akella
Сообщения: 42
Зарегистрирован: 05 ноя 2013, 12:55
Откуда: UA
Контактная информация:

Re: Урок 136. CursorLoader

Сообщение Akella » 09 янв 2014, 01:13

Сейчас читаю статью http://www.casarini.org/blog/2009/andro ... id-column/

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 09 янв 2014, 15:48

кошмар. это вы видимо никогда не работали с базами. У меня то опыт большой.
Akella писал(а):>>и что есть натуральный ключ?

имеется ввиду, что есть понятия ключей: естественный и суррогатный
иногда не имеет смысла создавать целочисленное по"ле "ID", когда есть текстовое поле "NAME", которое предполагается быть уникальным
это вообще вещь крайне специфическая! Когда у тебя бд, кторую ты создаешь сам, то нужно вводить искусственные ключи, а "натуральные" приходилось использовать только в крайних случаях, и то, из-за глупейшей системы полей в каких-нибудь идиотских базах данных какого-нибудь кладра

Тут же все просто . Уникальный ключ называешь _id, остальные - нормальной ссылкой на _id других таблиц в виде id_имятаблицы. В чем проблемы??
Никогда, никогда не называйте ключевые поля так, как вздумается, типа name. Это не аутентично, и другой разработчик, который будет разбираться в вашей бд вас проклянет.
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: Урок 136. CursorLoader

Сообщение Foenix » 09 янв 2014, 15:52

Akella писал(а):Натуральный ключ может быть основан не на целочисленном поле, а, например, на текстовом поле "product_name". С точки зрения объектной модели, глупо называть текстовое поле, где хранятся имена продуктов "_id". Правильнее, если оно будет называться именно "product_name". Так будет понятнее и разработчику, и тем, кто будет дорабатывать проект, как часто бывает. По имени поля сразу понятно, что там хранятся текстовые данные.
Придётся опять в запросе писать:
select product_name _id from products_table
зачем делать ключевым поле с именем продукта?? Если хотите уникальность - ну ставьте ему уникальный и все. В чем проблема??
даже если вы обзовете поле с ключевым полем имени продукта как _id андроид, боюсь, вас не поймет :mrgreen: Не пробовала делать подобную чепуху, но думаю, что это так.
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: Урок 136. CursorLoader

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

m090050 писал(а):
Foenix писал(а):
Akella писал(а):я в шоке от того, что я обязан в каждой таблице держать ключевое поле с именем "_id", а не с тем именем, которое я хочу
я в шоке, что ты хочешь какое-то другое имя вместо этого
Честно говоря я тоже соглашусь с ним. К чему жесткая привязка? Другое дело, что я не вижу в ней проблемы, но он...
и о составных ключах наверное не слышали
и о натуральных ключах тоже не слышали
Поясните пожалуйста что имеется ввиду. В чем проблема реализации составных ключей ДАЖЕ с жестким именем _id и что есть натуральный ключ? Первичный?
речь идет не просто о best practice в именовании некоторых объектов (ключей, переменных...) а о много большем и принципиальном..
ты мог бы себе представить таблицу, в которой первичным ключом были бы наименования чего-то, и соответственно, ссылочным полем на эту таблицу - было бы тоже текстовое поле, в котором были бы те же наименования?? я - нет.
R.id.team

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

Аватара пользователя
Akella
Сообщения: 42
Зарегистрирован: 05 ноя 2013, 12:55
Откуда: UA
Контактная информация:

Re: Урок 136. CursorLoader

Сообщение Akella » 09 янв 2014, 16:02

>>Никогда, никогда не называйте ключевые поля так, как вздумается, типа name. Это не аутентично, и другой разработчик, который будет разбираться в вашей бд вас проклянет.

ну это не Вам решать, есть возможность и есть понятия естественных ключей, не зря же их сделали
но в любом случае, очень часто называют ключевые поля примерно так: id_region, id_product, id_user
у меня практика такая: называть: ID
Мне и в голову не могло никогда прийти, что кто станет меня ограничивать, бред да и только

Аватара пользователя
Akella
Сообщения: 42
Зарегистрирован: 05 ноя 2013, 12:55
Откуда: UA
Контактная информация:

Re: Урок 136. CursorLoader

Сообщение Akella » 09 янв 2014, 16:13

Посмотрите на статью Паоло, я ссылку выше дал. Обратите внимание накартинку, какие имена ключевых полей там? Посмотрите на комментарии. Много там комментариев на тему: "ты идиот, потому что так назвал ключевые поля"???!

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 09 янв 2014, 21:49

Akella писал(а):>>Никогда, никогда не называйте ключевые поля так, как вздумается, типа name. Это не аутентично, и другой разработчик, который будет разбираться в вашей бд вас проклянет.

ну это не Вам решать, есть возможность и есть понятия естественных ключей, не зря же их сделали
но в любом случае, очень часто называют ключевые поля примерно так: id_region, id_product, id_user
у меня практика такая: называть: ID
Мне и в голову не могло никогда прийти, что кто станет меня ограничивать, бред да и только
ключевое слово я выделила.
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: Урок 136. CursorLoader

Сообщение Foenix » 09 янв 2014, 21:54

Akella писал(а):Посмотрите на статью Паоло, я ссылку выше дал. Обратите внимание накартинку, какие имена ключевых полей там? Посмотрите на комментарии. Много там комментариев на тему: "ты идиот, потому что так назвал ключевые поля"???!
кто такой этот Паоло, чтоб я читала его статью о том, что ему сложно назвать поле _id?

Что плохого в таблице, где ключевое поле названо _id, а остальные, ссылки на ключевые поля названы id_region? Не въеду. В первый раз сталкиваюсь с подобной ерундой.
R.id.team

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

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

Re: Урок 136. CursorLoader

Сообщение altwin » 10 янв 2014, 00:48

Akella писал(а):я в шоке от того, что я обязан в каждой таблице держать ключевое поле с именем "_id", а не с тем именем, которое я хочу
Во первых имя _id - нигде не обязательное. Оно лишь гарантирует документированное поведение Adapter -ов и в частности CursorAdapter, хотя даже их вы можете использовать, если не вызываете явно или не явно методы запрашивающие _id.

P.S. кодер отличается от программиста тем, что следует правилам, программист же эти правила создает. Возможности же инженера вообще безграничны... Когда вы используете Android Framework - вам рано задавать вопрос о том. что вы хотите делать не так. Да и структуры баз о которых вы говорили с более сложными _id в виде требования - излишни в мобильном устройстве на этом уровне. Когда же вы начнете ОСОЗНАННО выходить задачами за эти рамки, а не для поиграться никакой потребности в _id нет.
Изображение

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

Re: Урок 136. CursorLoader

Сообщение altwin » 10 янв 2014, 01:00

Akella писал(а):Сейчас читаю статью http://www.casarini.org/blog/2009/andro ... id-column/
Во первых статья 2009 года, во вторых профиль автора - http://www.linkedin.com/in/casarini, не впечатлил, даже читать желания нет... у него вообще нет опыта Android developer, в предыдущем опыте нашел только J2EE и че?
Изображение

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

Re: Урок 136. CursorLoader

Сообщение altwin » 10 янв 2014, 01:05

Akella писал(а):Посмотрите на статью Паоло, я ссылку выше дал. Обратите внимание накартинку, какие имена ключевых полей там? Посмотрите на комментарии. Много там комментариев на тему: "ты идиот, потому что так назвал ключевые поля"???!
а много там тех кто прочитал статью с 2009 года? или этот чувак кому -то интересен?
Изображение

NIK25683nik
Сообщения: 1
Зарегистрирован: 11 янв 2014, 19:28

Re: Урок 136. CursorLoader

Сообщение NIK25683nik » 11 янв 2014, 19:39

Подскажите пожалуйста как вставить картинки не из ресурсов а например просто из папки на флэшке.
Я понимаю что можно в БД в поле типа string хранить полный путь или просто имя файла, но не понимаю как и где преобразовывать его в картинку. Если можно фрагмент кода для примера.

GuryevAV
Сообщения: 3
Зарегистрирован: 13 янв 2014, 15:04

Re: Урок 136. CursorLoader

Сообщение GuryevAV » 13 янв 2014, 15:18

Добрый день.
У SimpleCursorTreeAdapter нет метода swapCursor(). Что можно использовать вместо?

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

Re: Урок 136. CursorLoader

Сообщение KamiSempai » 15 янв 2014, 17:47

У него есть для этого аж 2 метода, setGroupCursor и changeCursor.
После смены курсора старый курсор будет закрыт и его уже больше нельзя будет использовать.
Также, changeCursor, помимо всего прочего, закрывает все child курсоры.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

GuryevAV
Сообщения: 3
Зарегистрирован: 13 янв 2014, 15:04

Re: Урок 136. CursorLoader

Сообщение GuryevAV » 16 янв 2014, 16:46

У него есть для этого аж 2 метода, setGroupCursor и changeCursor.
После смены курсора старый курсор будет закрыт и его уже больше нельзя будет использовать.
Также, changeCursor, помимо всего прочего, закрывает все child курсоры.
Оба метода вызывают ошибку:

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

01-16 17:29:47.557: D/AndroidRuntime(25007): Shutting down VM
01-16 17:29:47.557: W/dalvikvm(25007): threadid=1: thread exiting with uncaught exception (group=0x40f889a8)
01-16 17:29:47.562: E/AndroidRuntime(25007): FATAL EXCEPTION: main
01-16 17:29:47.562: E/AndroidRuntime(25007): java.lang.NullPointerException
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.example.shops_db_adapter.MainActivity.onOptionsItemSelected(MainActivity.java:137)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.app.Activity.onMenuItemSelected(Activity.java:2566)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:372)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:995)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:166)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.widget.AdapterView.performItemClick(AdapterView.java:298)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.widget.AbsListView.performItemClick(AbsListView.java:1128)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:2812)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.widget.AbsListView$1.run(AbsListView.java:3571)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.os.Handler.handleCallback(Handler.java:725)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.os.Handler.dispatchMessage(Handler.java:92)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.os.Looper.loop(Looper.java:153)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at android.app.ActivityThread.main(ActivityThread.java:5297)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at java.lang.reflect.Method.invokeNative(Native Method)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at java.lang.reflect.Method.invoke(Method.java:511)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-16 17:29:47.562: E/AndroidRuntime(25007): 	at dalvik.system.NativeStart.main(Native Method)
Cursor передаю новый:

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

cursor = db.getShopData();
...
SimpleCursorTreeAdapter sctAdapter = new MyAdapter(this, cursor,
				android.R.layout.simple_expandable_list_item_1, groupFrom,
				groupTo, android.R.layout.simple_list_item_1, childFrom, childTo);
...
Cursor c1 = null;
sctAdapter.setGroupCursor(db.SortShopData(c1));
В логах вижу, что курсор возвращается с нужными данными.
Что я делаю не так?

plika
Сообщения: 5
Зарегистрирован: 21 янв 2014, 14:38

Re: Урок 136. CursorLoader

Сообщение plika » 21 янв 2014, 14:47

Добрый день!

При создании лоадера
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, this);
создается курсор с данными, которые помещаются в ListView.

Могу я использовать этот курсор в своих целях (например, заполнить массив) ? Как к нему обратиться?

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

Re: Урок 136. CursorLoader

Сообщение Foenix » 21 янв 2014, 15:02

можно курсор использовать как угодно. ТАм есть метод (точно не помню) посмотри по-моему getCursor()
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: Урок 136. CursorLoader

Сообщение KamiSempai » 21 янв 2014, 15:30

GuryevAV писал(а):Оба метода вызывают ошибку:
Ошибку вызывает MainActivity в onOptionsItemSelected. В 137 строке обращение к null.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

plika
Сообщения: 5
Зарегистрирован: 21 янв 2014, 14:38

Re: Урок 136. CursorLoader

Сообщение plika » 21 янв 2014, 15:34

Foenix писал(а):можно курсор использовать как угодно...
подозревал, что должно быть так :)
Foenix писал(а):ТАм есть метод (точно не помню) посмотри по-моему getCursor()
Не нашел.. :( А чей это метод? Где копать?
PS Нашел :) у адаптера
Спасибо

Ответить