Подход к доступу к базе данных Android - PullRequest
5 голосов
/ 30 августа 2010

У меня есть общий вопрос дизайна Android относительно доступа к данным.У меня есть несколько действий в моем приложении, которые должны получить доступ к базе данных SQLite.Чтобы обернуть всю логику доступа к данным в одном месте, я создал класс DatbaseHandler, который заботится обо всей логике доступа к данным.Этот класс заботится о создании предложений where, вызове базы данных и опросе результирующего курсора, чтобы получить результаты запроса и вернуть их вызывающей стороне.Целью этого класса является объединение всего кода доступа к данным в одном месте, чтобы его можно было легко обслуживать и обслуживать, а не рассредоточить логику доступа к данным по всем действиям.Каждое действие, которому необходим доступ к базе данных, создает экземпляр этого класса DatabaseHandler и передает ему ссылку на android.content.Context.Затем класс DatabaseHandler использует этот объект Context для вызова основного поставщика контента следующим образом: context_i.getContentResolver (). Query (...).

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

У меня следующие вопросы:

  1. Как я могу (если это возможно) управлять жизненным циклом курсоров извне действия?
  2. Должно ли каждое действие даже создавать экземпляр этого класса обработчика данных и передавать ему экземпляр Context?Возможно, мой подход к проектированию неверен, и я должен представить эти функции доступа к данным как статические методы, которые принимают экземпляр вызывающего действия в качестве параметра.Таким образом, я мог бы выполнять управляемые запросы и позволять деятельности позаботиться об управлении жизненным циклом курсоров?

Мне бы очень хотелось получить представление о наилучшем подходе.Любой совет будет принята с благодарностью

1 Ответ

2 голосов
/ 30 августа 2010

Стандартный подход:
Обычно, если у вас есть созданный вами ContentProvider и вы правильно зарегистрировали его в файле manifest.xml, вы можете просто сделать (например)

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

   if (getIntent().getData() == null) {
       getIntent().setData(MyMetaData.CONTENT_URI);
   }

   Cursor cursor = managedQuery(getIntent().getData(), null, null, null, null);

   //create an appropriate adapter and bind it to the UI
   ...
}

при этом будет автоматически вызываться ContentProvider, который может обрабатывать заданный uri контента, если вы зарегистрировали его в файле manifest.xml, например

<provider android:name="MyContentProvider" android:authorities="com.mycompany.contentprovider.MyContentProvider" />

Я всегда предлагаю людям взглянуть на Пример с блокнотом для изучения того, как следует реализовывать ContentProviders.

Альтернативы:
Вообще говоря, если вам нужен доступ к вашим данным только во время вашей деятельности, я бы добавилк «Стандартному подходу» с использованием ContentProviders, который кстати.возможно, делает его наиболее гибким решением.
Если вашему решению требуется для доступа к данным также из не-Activity классов, где у вас нет методов «managedQuery», то вы могли бы реализовать какой-то видDAO (объект доступа к данным) занимается самостоятельно.Примером может быть

public class MyDataDao implements IMyDataDao {
   private ContentResolver contentResolver;

   public MyDataDao(ContentResolver contentResolver){
      this.contentResolver = contentResolver;
   }


   @Override
   public MyDataObject readMyDataObjectById(long id){
      MyDataObject result = null;

      Cursor myDataObjectCursor = contentResolver.query(...);
      if(myDataObjectCursor != null && myDataObjectCursor.moveToFirst()){
         result = new MyDataObject();
         result.setTitle(myDataObjectCursor.get..);
         ...
      }
      myDataObjectCursor.close();

      return result;
   }
}

Это может также сработать.Затем вы звоните своему DAO

IMyDataDao dao = new MyDataDao(context.getContentResolver());
MyDataObject anObj = dao.readMyDataObjectById(10);
...

Надежда, которая указала вам в правильном направлении:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...