daily pastebin goal
48%
SHARE
TWEET

Untitled

a guest Feb 13th, 2018 68 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.sourceit.databaseprovider;
  2.  
  3. import android.content.ContentProvider;
  4. import android.content.ContentValues;
  5. import android.content.Context;
  6. import android.content.UriMatcher;
  7. import android.database.Cursor;
  8. import android.database.sqlite.SQLiteDatabase;
  9. import android.database.sqlite.SQLiteQueryBuilder;
  10. import android.net.Uri;
  11. import android.support.annotation.NonNull;
  12. import android.support.annotation.Nullable;
  13. import android.text.TextUtils;
  14.  
  15. /**
  16.  * Created by wenceslaus on 06.11.16.
  17.  */
  18.  
  19. public class MyContentProvider extends ContentProvider {
  20.  
  21.     //поля необходимые для идентификации таблиц
  22.     private static final String AUTHORITY = BuildConfig.AUTHORITY;
  23.     private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
  24.  
  25.     //список таблиц
  26.     private final NotesTable messagesTable = new NotesTable();
  27.  
  28.     //инициализвания URI_MATCHER с таблицами для упрощения идендификации
  29.     static {
  30.         URI_MATCHER.addURI(AUTHORITY, NotesTable.NAME, MappedUri.NOTES);
  31.         URI_MATCHER.addURI(AUTHORITY, NotesTable.NAME + "/#", MappedUri.NOTES_ITEM);
  32.     }
  33.  
  34.     //собственно база данных
  35.     private SQLiteDatabase database;
  36.  
  37.     @Override
  38.     public boolean onCreate() {
  39.         //получение доступа в базу в режиме writable
  40.         database = new DataBaseHelper(getContext()).getWritableDatabase();
  41.         return true;
  42.     }
  43.  
  44.     /**
  45.      * Обрабатывает запрос на выборку данных
  46.      * @param uri - указатель на таблицу
  47.      * @param projection - список столбцов для выборки
  48.      * @param selection - условия выборки
  49.      * @param selectionArgs - аргументы для условия выборки
  50.      * @param sortOrder - условия сортировки
  51.      * @return - курсор с результатами выборки
  52.      */
  53.     @Nullable
  54.     @Override
  55.     public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
  56.         //получаем таблицу по указателю
  57.         Table table = getTable(uri);
  58.         //создаем конструктов запросов к таблице
  59.         SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
  60.         builder.setTables(table.getName());
  61.         //если указатель содержить id записи (указывает не на всю таблицу, а на конкретный элемент)
  62.         if (isItemUri(uri)) {
  63.             //добавляем id к условию выборки
  64.             builder.appendWhere(table.getColumnId() + "=" + uri.getLastPathSegment());
  65.         }
  66.         //запрос к базе со всеми параметрами
  67.         Cursor cursor = builder.query(database, projection, selection, selectionArgs, null, null, sortOrder);
  68.         //подписываемся на изменения текущей таблицы
  69.         setNotificationUri(cursor, uri);
  70.         return cursor;
  71.     }
  72.  
  73.     /**
  74.      * Обрабатывает запрос на вставку данных в таблицу
  75.      * @param uri - указатель на таблику
  76.      * @param values - значения для вставки в таблицу
  77.      * @return указатель на вставленный элемент
  78.      */
  79.     @Nullable
  80.     @Override
  81.     public Uri insert(@NonNull Uri uri, ContentValues values) {
  82.         //получаем таблицу по указателю
  83.         Table table = getTable(uri);
  84.         //вставка данных в таблицу
  85.         long rowId = database.insert(table.getName(), null, values);
  86.         //получение указателя по id вставленной записи
  87.         Uri resultUri = table.getItemUri(rowId);
  88.         //оповещаем про изменения в таблице
  89.         notifyChange(uri);
  90.         return resultUri;
  91.     }
  92.  
  93.     /**
  94.      * Удаляет записи по условию (если условие не задано - очищает всю таблицу)
  95.      * @param uri - указатель на таблицу
  96.      * @param selection - условия выборки
  97.      * @param selectionArgs - аргументы для условия выборки
  98.      * @return количество удаленных записей
  99.      */
  100.     @Override
  101.     public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
  102.         //получаем таблицу по указателю
  103.         Table table = getTable(uri);
  104.         //если указатель содержить id записи и условия выборки отсутствуют
  105.         if (isItemUri(uri) && TextUtils.isEmpty(selection)) {
  106.             //добавляем id к условию выборки
  107.             selection = table.getColumnId() + "=" + uri.getLastPathSegment();
  108.         }
  109.         //удаление данных из таблицы
  110.         int deletedRowNum = database.delete(table.getName(), selection, selectionArgs);
  111.         //оповещение про изменения в таблице
  112.         notifyChange(uri);
  113.         return deletedRowNum;
  114.     }
  115.  
  116.  
  117.     /**
  118.      *
  119.      * @param uri - указатель на таблицу
  120.      * @param values - новые значения для обновления даных в таблице
  121.      * @param selection - условия выборки записей для обновления
  122.      * @param selectionArgs - аргументы для условия выборки
  123.      * @return - количество обновленных записей
  124.      */
  125.     @Override
  126.     public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  127.         //получаем таблицу по указателю
  128.         Table table = getTable(uri);
  129.         //если указатель содержить id записи и условия выборки отсутствуют
  130.         if (isItemUri(uri) && TextUtils.isEmpty(selection)) {
  131.             //добавляем id к условию выборки
  132.             selection = table.getColumnId() + "=" + uri.getLastPathSegment();
  133.         }
  134.         //обновляем данные в таблице
  135.         int updatedRowsNum = database.update(table.getName(), values, selection, selectionArgs);
  136.         //если ничего не обновилось
  137.         if (updatedRowsNum == 0) {
  138.             //вставляем записть в таблицу, как новую
  139.             database.insert(table.getName(), null, values);
  140.             updatedRowsNum = 1;
  141.         }
  142.         //уведомляем про изменнеия
  143.         notifyChange(uri);
  144.         return updatedRowsNum;
  145.     }
  146.  
  147.     /**
  148.      * Возвращает тип таблицы или бросает исключение, если она не наедена
  149.      */
  150.     @Nullable
  151.     @Override
  152.     public String getType(@NonNull Uri uri) {
  153.         switch (URI_MATCHER.match(uri)) {
  154.             case MappedUri.NOTES:
  155.                 return messagesTable.getContentType();
  156.             default:
  157.                 throw new IllegalArgumentException("Uri: " + uri + " is not supported");
  158.         }
  159.     }
  160.  
  161.     /**
  162.      * Ищем таблиуцу по указателю
  163.      * @param uri - указатель
  164.      * @return - таблица
  165.      */
  166.     private Table getTable(Uri uri) {
  167.         switch (URI_MATCHER.match(uri)) {
  168.             case MappedUri.NOTES:
  169.             case MappedUri.NOTES_ITEM:
  170.                 return messagesTable;
  171.  
  172.             default:
  173.                 throw new IllegalArgumentException("Uri: " + uri + " is not supported");
  174.         }
  175.     }
  176.  
  177.     /**
  178.      * Проверяет, указывает ли uri на конкретный элемент в таблице
  179.      */
  180.     private boolean isItemUri(Uri uri) {
  181.         switch (URI_MATCHER.match(uri)) {
  182.             case MappedUri.NOTES_ITEM:
  183.                 return true;
  184.         }
  185.         return false;
  186.     }
  187.  
  188.     /**
  189.      * Подписывается на изменения в таблице
  190.      */
  191.     private void setNotificationUri(Cursor cursor, Uri uri) {
  192.         Context context = getContext();
  193.         if (context != null) {
  194.             cursor.setNotificationUri(context.getContentResolver(), uri);
  195.         }
  196.     }
  197.  
  198.     /**
  199.      * Уведомляет об изменениях в таблице
  200.      */
  201.     private void notifyChange(Uri uri) {
  202.         Context context = getContext();
  203.         if (context != null) {
  204.             context.getContentResolver().notifyChange(uri, null);
  205.         }
  206.     }
  207.  
  208.     /**
  209.      * Список таблиц и указателей
  210.      */
  211.     public interface MappedUri {
  212.         int NOTES = 0;
  213.         int NOTES_ITEM = 1;
  214.     }
  215. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top