(o) droid and sql(lite); sql crash course (most common sql lite db usages in android): http://code.tutsplus.com/tutorials/android-sqlite--mobile-2918 and of course googles's how-to on subject: https://developer.android.com/training/basics/data-storage/databases.html (o) what is it? abstract google overview: https://developer.android.com/guide/topics/providers/content-provider-basics.html с други думи: най-добрата форма за обмяна на данние между приложенията. Всяко приложение, има своя собствена директория и област от паметта, недостъпни за останалите приложения, което прави невъзможно директното писане/четене; ContentProviders можем да си представим като м-во данни, паковано в наше си API, което позволява четене/писане; Приложенията (или процесите) трябва да се регисрират като Content Providers; Търсещите определени данни, могат да поискат от Андроид четене/писане до тези данни; ContentProvider API реализира CRUD принципа - Create, Read, Update and Delete; content-provider-image.png Специален вид URI, започващ със content:// присвяваме на всеки content provider (или е присвоен). С негова помощ се осигурява достъп до данните между приложенията Как го дефинираме: Състои се от четири части: content://authority/path/id content:// - задължително, всички content provider uris започват така; 'authority' - Java namespace на реализазията, т.е. fully qualified package (заедно с класа) релизиращ provider-a 'path' - implementation specific виртуална директория, определяща типа на данните които ще се обработват; 'id' - id на конкретен запис (или без него, ако искаме всички); (o) using it? (ContentC.zip) ContentResolver in client; ContentProvider in server; example: mCursor = getContentResolver().query( <>, // The content URI of the words table mProjection, // The columns to return for each row mSelectionClause // Selection criteria mSelectionArgs, // Selection criteria mSortOrder); // The sort order for the returned rows Catch? Single Activity's Thread and ANR - we have to use loaders :( https://developer.android.com/guide/components/loaders.html extends LoaderManager.LoaderCallbacks @Override: onCreateLoader() — инициализираме за конкретно ID; onLoadFinished() — когато сме завършили зареждането; onLoaderReset() — при reset на нашият loader; т.е. получваме извикване, когато loader обекта ще бъде затворен; можем да се справим с вентуалните refs към неговите данни; why usage is so important: https://developer.android.com/guide/topics/providers/calendar-provider.html https://developer.android.com/guide/topics/providers/contacts-provider.html и разбира се: https://developer.android.com/guide/topics/ui/layout/listview.html (готов за нас View, който извежда структурирана информация) (o) making it(ContentP.zip) Much more complicated ... as usual ;) but basically - extend ContentProvider, @Override crud methods, define matcher and of course DB helper class; ... Caused by: java.lang.IllegalArgumentException: Unknown URL content://net.yaht.m.contentp.MyProvider/mcp at android.content.ContentResolver.insert(ContentResolver.java:1186) at net.yaht.m.contentp.MainActivity._handle_btn_add(MainActivity.java:31) at java.lang.reflect.Method.invokeNative(Native Method)  ... => register your provider man;