Autore Topic: Content Provider e tabelle "dinamiche"  (Letto 670 volte)

Offline idrone

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Sistema operativo:
    Mac OS X 10.7.5
Content Provider e tabelle "dinamiche"
« il: 16 Settembre 2013, 13:29:50 CEST »
0
Ho chiesto anche nel tutorial sul Content Provider ma non ho ricevuto risposte perché meno frequentato. Chiedo qui.

Devo creare un Content Provider per un app in cui le tabelle vengono create dall'utente quando ne ha bisogno o voglia.

Il mio problema è esattamente come generare un uri  univoco ma variabile... considerando che l'uri  e l'uri matcher viene creato a priori dallo sviluppatore...

Codice (Java): [Seleziona]
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);      
}



Offline matttt

Re:Content Provider e tabelle "dinamiche"
« Risposta #1 il: 16 Settembre 2013, 18:33:18 CEST »
0
URI univoco rispetto a tutti gli utilizzatori della tua app?
Il sistema più "consono" per me sarebbe fornire l'URI generato da un server centrale.
Un'altro sistema meno "ortodosso" diciamo potrebbe essere ricavare il codice IMEI del dispositivo, associarlo al timestamp attuale e generare un URI da quello ma... tutti i dispositivi hanno un IMEI? L'ora del dispositivo potrebbe venire modificata e in un caso molto remoto uno stesso utente potrebbe generare 2 volte lo stesso URI. Inoltre penso non sarebbe molto rispettoso a livello privacy.
Le mie apps su Google Play Store:

Offline idrone

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Sistema operativo:
    Mac OS X 10.7.5
Re:Content Provider e tabelle "dinamiche"
« Risposta #2 il: 17 Settembre 2013, 12:05:58 CEST »
0
Nel senso che ogni Uri rimanda a dei comandi per una diversa tabella...
Ad esempio il codice insert per gli uri già inseriti nel primo post sarà:
Codice (Java): [Seleziona]
@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 to insert row into " + uri);
    }
    return _uri;                
}

Per ogni CASE viene specificata una diversa tabella DATABASE_TABLE1...DATABASE_TABLE2...
Nel mio caso non so A PRIORI quante tabelle ci sono... ne il nome che esse hanno perché è l'utente a decidere che tabelle vorrà e come le vorrà... io stabilisco solo la struttura delle tabelle...

Come posso fare per utilizzare il Content Provider in questo caso?

Offline matttt

Re:Content Provider e tabelle "dinamiche"
« Risposta #3 il: 17 Settembre 2013, 20:40:14 CEST »
0
Faccio fatica ad inquadrare esattamente la tua problematica... cmq se non ho capito male: e se codifichi nell'uri il nome del database magari separato dal resto da un carattere distintivo (potrebbe essere underscore, slash, etc.) ? Allo stesso modo potresti passare altri parametri (nome tabella, operazione da fare, etc.)
Le mie apps su Google Play Store:

Offline idrone

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Sistema operativo:
    Mac OS X 10.7.5
Re:Content Provider e tabelle "dinamiche"
« Risposta #4 il: 18 Settembre 2013, 09:57:30 CEST »
0
Io attualmente utilizzo questi due codici nel DbAdapter:
Codice (Java): [Seleziona]
public void createTable(String name_table) {
         String TABLE = PREFISSO+name_table;
         String TABLE_CREATE =
                          "CREATE TABLE if not exists '" + TABLE + "' (" +
                          KEY_ROWID + " integer PRIMARY KEY autoincrement," +
                          KEY_VALUE + " text " +
                          ");";
         mDb.execSQL(TABLE_CREATE);
                 }
Codice (Java): [Seleziona]
 
 public long createRowOnTable(String table, String id, String value) {
 
  ContentValues initialValues = new ContentValues();
  initialValues.put(KEY_ROWID, id);
  initialValues.put(KEY_VALUE, value);
 
  return mDb.insert(PREFISSO+table, null, initialValues);
 }

Come vedi ogni comando di insert dipende dal nome della tabella immessa...
riguardando bene il codice posso restringere la domanda a: posso aggiungere altri valori in fase di richiesta?
Es:
Codice (Java): [Seleziona]
getContentResolver().insert(MyContentProvider.NOTE_CONTENT_URI, nome_tabella ,values);

Offline idrone

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Sistema operativo:
    Mac OS X 10.7.5
Re:Content Provider e tabelle "dinamiche"
« Risposta #5 il: 30 Settembre 2013, 23:32:14 CEST »
0
Più o meno sto riuscendo nel progetto...posterò anche i codici una volta terminato...ho però un problema... Devo effettuare una Query su tutte le tabelle di colonne con lo stesso nome... Imposto le tabelle con querybuilder.setTables ma come risultato mi dice che il nome delle colonne è duplicato. Come fare?

Offline matttt

Re:Content Provider e tabelle "dinamiche"
« Risposta #6 il: 01 Ottobre 2013, 20:23:03 CEST »
0
Se hai query complesse potresti usare direttamente rawQuery() così se hai nomi di colonne uguali puoi rinominarle con AS
Codice (SQL): [Seleziona]
SELECT col1 AS col2 FROM table1;
« Ultima modifica: 01 Ottobre 2013, 20:40:14 CEST da matttt »
Le mie apps su Google Play Store:

Offline idrone

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC One S
  • Sistema operativo:
    Mac OS X 10.7.5
Re:Content Provider e tabelle "dinamiche"
« Risposta #7 il: 01 Ottobre 2013, 22:39:59 CEST »
0
Si ma io non conosco il numero di tabelle a priori per cui non posso scrivere il comando IS...
attualmente ho utilizzato un ciclo per generare una serie di SQL unite da UNION ALL ma mi sembra pesante...

« Ultima modifica: 01 Ottobre 2013, 23:00:24 CEST da idrone »

Offline matttt

Re:Content Provider e tabelle "dinamiche"
« Risposta #8 il: 03 Ottobre 2013, 18:56:31 CEST »
0
Ma... nel momento in cui fai la query saprai le tabelle coinvolte, giusto?
E in quel caso ti basterà comporre opportunamente la stringa di query usando n AS...
Le mie apps su Google Play Store: