2012-03-15 4 views
7

Sto tentando di creare un provider di contenuti che utilizza la memoria interna. Tuttavia, tutti gli esempi che vedo online utilizzano solo sqlite.Esempi di provider di contenuti che non utilizzano SQLite

Qualcuno può fornirmi un buon tutorial o un esempio di creazione di provider di contenuti utilizzando la memoria interna?

+0

Si prega di definire cosa si intende per "un fornitore di contenuti che utilizza la memoria interna", considerando che SQLite generalmente utilizza la memoria interna, ma non si desidera SQLite. – CommonsWare

+0

@CommonsWare Secondo la pagina Sviluppo Android, ci sono 5 modi per memorizzare i dati: Preferenze condivise, Archiviazione interna, Archiviazione esterna, Database SQLite e Connessione di rete. Desidero che il mio fornitore di contenuti utilizzi l'opzione Memoria interna. – drum

+0

L'archiviazione interna in quel contesto indica l'archiviazione di materiale nei file nell'area dei dati privati ​​dell'applicazione. Non è davvero un'API in quanto tale. Dato che i database SQLite sono archiviati come file nell'area dei dati privati ​​della tua applicazione, devi fare qualcosa di abbastanza specialistico per renderlo degno di essere il disturbo - usare SQLite è generalmente più facile (e più veloce). –

risposta

4

È possibile memorizzare i dati nei file, utilizzando i metodi di file per provider di contenuto come openTypedAssetFile(). Ciò restituisce un oggetto AssetFileDescriptor (ovvero un handle di file valido per tutti i processi) anziché un cursore.

Nel complesso, la domanda è molto difficile da rispondere. Un content provider è una "interfaccia" tra un repository di dati e client. La documentazione non dice molto sugli archivi diversi da SQLite perché a) il modello del fornitore di contenuti è organizzato sulla falsariga di un database relazionale eb) ogni implementazione di un fornitore di contenuti sarà diversa.

Esito a dare ulteriori consigli prima di conoscere le vostre esatte esigenze. Può darsi che tu possa trarre vantaggio da SQLite, sebbene tu non possa immediatamente capire perché. Potrebbe anche avere ragione: SQLite non è la soluzione, ma date più informazioni potrei proporre alcune idee.

+0

Vedo quello che stai dicendo. Inoltre, sembra che alcune delle funzioni di ContentProvider richiedano un database. Ho cercato di trovare modi per implementare la funzione query(), ma dal momento che deve restituire un oggetto Cursore, immagino che SQLite sia un must in questo caso. – drum

+1

Trova [questo] (https://android.googlesource.com/platform/packages/providers/WebSearchProvider/+/8637dd8dc1b255052b2615430bfb4603fa8711f7/src/com/android/websearch/SuggestionProvider.java) non utilizzare SQLIte. I dati di origine sono JSONArray. Possiamo imparare come creare un cursore estendere AbstractCursor. – Yeung

0

Beh, so che cosa stai cercando di fare, magari creare immagini, film o simili con la memoria interna.

È possibile utilizzare InternalStorage per memorizzare byte di dati. Se avete i byte si può semplicemente fare:

String FILENAME = "hello_file"; 
String string = "hello world!"; 

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

per farlo fuori:

File file = ... 
    OutputStream out = null; 
    try { 
    out = new BufferedOutputStream(new FileOutputStream(file)); 
    ... 
    finally { 
    if (out != null) { 
     out.close(); 
    } 
    } 

Tutte le sorgenti si trovano sul this e this. Non posso aiutarti oltre a questa causa, non l'ho mai provato.

+0

Sì, ho già visto questa pagina Tuttavia, questo non funziona nel fornitore di contenuti. – drum

1

C'è un esempio chiamato FileProvider.java negli esempi di SDK Android che utilizza ContentProvider ma non il database SQLite.