sqlite - Best practices for exposing multiple tables using content providers in Android -


i'm building app have table events , table venues. want able grant other applications access data. have few questions related best practices kind of problem.

  1. how should structure database classes? have classes eventsdbadapter , venuesdbadapter, provide logic querying each table, while having separate dbmanager (extends sqliteopenhelper) managing database versions, creating/upgrading databases, giving access database (getwriteable/readeabledatabase). recommended solution, or better off either consolidating 1 class (ie. dbmanager) or separation , letting each adapter extends sqliteopenhelper?

  2. how should design content providers multiple tables? extending previous question, should use 1 content provider whole app, or should create separate providers events , venues?

most examples find deal single table apps, appreciate pointers here.

it's bit late you, others may find useful.

first need create multiple content_uris

public static final uri content_uri1 =      uri.parse("content://"+ provider_name + "/sampleuri1"); public static final uri content_uri2 =      uri.parse("content://"+ provider_name + "/sampleuri2"); 

then expand uri matcher

private static final urimatcher urimatcher; static {     urimatcher = new urimatcher(urimatcher.no_match);     urimatcher.adduri(provider_name, "sampleuri1", sample1);     urimatcher.adduri(provider_name, "sampleuri1/#", sample1_id);           urimatcher.adduri(provider_name, "sampleuri2", sample2);     urimatcher.adduri(provider_name, "sampleuri2/#", sample2_id);       } 

then create tables

private static final string database_name = "sample.db"; private static final string database_table1 = "sample1"; private static final string database_table2 = "sample2"; private static final int database_version = 1; private static final string database_create1 =     "create table if not exists " + database_table1 +      " (" + _id1 + " integer primary key autoincrement," +      "data text, stuff text);"; private static final string database_create2 =     "create table if not exists " + database_table2 +      " (" + _id2 + " integer primary key autoincrement," +      "data text, stuff text);"; 

don't forget add second database_create oncreate()

you going use switch-case block determine table used. insert code

@override public uri insert(uri uri, contentvalues values) {     uri _uri = null;     switch (urimatcher.match(uri)){     case sample1:         long _id1 = db.insert(database_table1, "", values);         //---if added successfully---         if (_id1 > 0) {             _uri = contenturis.withappendedid(content_uri1, _id1);             getcontext().getcontentresolver().notifychange(_uri, null);             }         break;     case sample2:         long _id2 = db.insert(database_table2, "", values);         //---if added successfully---         if (_id2 > 0) {             _uri = contenturis.withappendedid(content_uri2, _id2);             getcontext().getcontentresolver().notifychange(_uri, null);             }         break;     default: throw new sqlexception("failed insert row " + uri);     }     return _uri;                 } 

you need devide delete, update, gettype, etc. wherever provider calls database_table or content_uri add case , have database_table1 or content_uri1 in 1 , #2 in next , on many want.


Comments

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -