2013-09-18 2 views
3

Я наткнулся на многие ссылки на использование объекта Cursor, но ни один о том, как он использовал лучший. Поэтому у меня есть несколько вопросов, на которые я бы очень хотел ответить.Лучшее использование курсора

  • Можно ли использовать один Cursor для всех операций с базой данных приложения? Если нет, то почему?
  • Действительно ли необходимо продолжать открывать и закрывать Cursor с после каждого использования?
  • Адрес this link close() is Closes the Cursor, releasing all of its resources and making it completely invalid. Что происходит, когда оно становится недействительным? Будет ли он повторно использоваться?

Большое спасибо.

+0

'1.' Курсор содержит результаты запроса ... для каждого запроса вы получите новый Cursor' 2.' yes, необходимо '3.' invalid означает invalid ... invalid Cursor не может использоваться или re-used ... – Selvin

+0

Итак, зачем нужно закрывать курсор, если он становится недействительным и, следовательно, не может использоваться? – ClaireG

+0

для бесплатных ресурсов ... у вас есть аналогичная ситуация с Bitmap.recycle() ... internaly эти API-интерфейсы написаны i C ... там нет GC ... поэтому вы должны сказать прямо: «Я не знаю», t нужно это больше » – Selvin

ответ

3

1.) Можно ли использовать один курсор для всех операций базы данных приложения? Если нет, то почему?

Да. Можно повторно использовать курсор. Однако вы должны знать, что работа курсора не такая интуитивная, как вы думаете. Курсор не извлекает все данные из некоторого хранилища данных и не сохраняет их все в памяти. Вместо этого он извлекает данные только по мере необходимости, что минимизирует использование памяти. Поэтому всегда рекомендуется закрыть курсор перед повторной инициализацией. Тем не менее, на самом деле не так уж много штрафов за производительность при создании абсолютно нового курсора каждый раз, когда вам это нужно.

2.) Неужели необходимо постоянно открывать и закрывать курсоры после каждого использования?

Да, да и да. У меня когда-то было много проблем, отлаживая какое-то сетевое приложение, которое должно периодически синхронизировать действия телефона с локальной db, а затем отправлять на внешний сервер. Открытие и закрытие (особенно закрытие) важно, как и любой другой поток или конечная точка для связи в java или андроиде, например FileInputStream или Socket

3.) По этой ссылке определение close() - это закрытие курсора, повторное использование всех его ресурсов и сделать его полностью недействительным. Что происходит, когда оно становится недействительным? Будет ли он повторно использоваться?

Как я уже говорил выше, метод close() работает так же, как и большинство других методов close() других классов Java. Как только вы его назовете, вам больше не следует использовать курсор. Это похоже на метод close() класса Socket. Как только Socket закрыт, он недоступен для дальнейшего использования в сети (т. Е. Не может быть повторно подключен или отскок). Необходимо создать новый сокет.

+0

Спасибо linuxjava, это тот ответ, который я искал :) – ClaireG

+0

Добро пожаловать ClaireG – linuxjava

0

Лучшая практика использования курсора является использование погрузчиков (cursorLoader в частности), посмотрите: https://developer.android.com/guide/components/loaders.html

+0

Спасибо, ссылка очень полезна, но она не отвечает на все мои вопросы. – ClaireG

+0

На все ваши вопросы будет дан ответ, как только вы поймете работу и поток курсора. Он полностью управляет жизненным циклом курсора. –

1

1.Every запрос возвращает новый курсор. Таким образом, вы можете использовать один и тот же локальный курсор и повторно инициализировать его с помощью возвращаемого курсора

2.yes необходимо закрыть каждый курсор. Поскольку некоторые неожиданные ошибки/сила близко может, может привести к повреждению вашей базы данных она открыта, а также сделано, чтобы освободить ресурсы

3.invalid означает недействителен ... недействительный Cursor нельзя использовать или повторно использовать в качестве Selvin грустной

Смежные вопросы