Autore Topic: Condividere Database tra Activities  (Letto 1436 volte)

Offline Sezze

  • Nuovo arrivato
  • *
  • Post: 8
  • Respect: 0
    • Mostra profilo
Condividere Database tra Activities
« il: 11 Settembre 2011, 11:30:22 CEST »
0
Dunque, sto cercando di creare un'applicazione che sfrutti un database SQLite.
Ho seguito il vostro tutorial: http://www.anddev.it/index.php/topic,856.msg5420.html, ma ho diversi dubbi.

1. Ho diverse Activities, molte delle quali estendono la classe ListView, come posso fare per "condividere" il database
con tutte queste classi, in modo tale che non ci siano problemi di concorrenza o altro?
Ho letto diverse soluzioni, ad esempio:

- Usando un Singleton per la classe dedicata al database
- Usando un servizio in background
- Estendendo la classe Application

Secondo voi qual è il metodo più indicato, considerando che nella maggior parte delle Activity devo solo LEGGERE dal
database? In realtà devo scrivere solo in fase di creazione e quando implementerò il metodo per sincronizzarmi con un database
online MySQL, ma in generale le activity servono solo a mostrare dei dati.

2. Come si rendono i dati persistenti? Utilizzando il button back, l'Activity non ricarica i dati dal database specificati nell'onCreate() risultando in una
ListView vuota. Vorrei evitare il Content Provider, poichè non ho intenzione condividere i miei dati con altre applicazioni.

3. Ho letto che il costruttore SimpleCursorAdapter usato nel tutorial è deprecato; viene consigliato di utilizzare un LoaderManager con un CursorLoader,
sapreste indicarmi qualche link di esempio?

4. Quando nel tutorial si dice:
// consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento

A parte il poco divertimento  :-), l'array di oggetti Prodotto devon essere dichiarati statici (vedi punto 2.)?

5. Sempre nel tutorial, quando viene impostato l'adapter:

Codice: [Seleziona]
productsLv.setAdapter(adapter);

Il codice fino a quel punto è sufficiente a popolare la ListView? Perchè nel mio caso la lista viene riempita correttamente, mentre se aggiungo
la parte successiva ricevo un NullPointerException.
Nel caso in cui ci si possa fermare prima, rimane necessaria la chiamata:

Codice: [Seleziona]
startManagingCursor(c);

Non ho ancora ben capito a cosa serve!

Grazie e scusate se ho chiesto più cose in un solo thread, ma ho un sacco di dubbi!
« Ultima modifica: 11 Settembre 2011, 11:32:08 CEST da Sezze »

Offline Jarod56

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Lg Dual
  • Sistema operativo:
    Ubuntu 11.04 / Windows 7
Re:Condividere Database tra Activities
« Risposta #1 il: 12 Dicembre 2011, 12:35:29 CET »
0
Anche a me interessa molto questo tema.
Io sono partito dal tutorial che c'è in questo sito, ma ho bisogno di condividere il database tra più activity (Lo devo condividere tra varie activity fatte partire da una TabActivity ).

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Condividere Database tra Activities
« Risposta #2 il: 12 Dicembre 2011, 15:25:26 CET »
+1
Citazione
1. Ho diverse Activities, molte delle quali estendono la classe ListView, come posso fare per "condividere" il database
con tutte queste classi, in modo tale che non ci siano problemi di concorrenza o altro?

Secondo me, in ogni activity, dovresti fare come nel tutorial:
Codice (Java): [Seleziona]
 MyDatabase db=new MyDatabase(getApplicationContext());. Le listview sono popolate direttamente con i dati del Cursor? Oppure prima li salvi in qualche array? Nel primo caso, apertura e settaggio dell'adapter li potresti fare nell'onResume(), mentre chiudi il database nell'onPause(), nel secondo caso apri il database/salvi i dati nelle tue variabili/ chiudi il database nel punto del codice che preferisci.


Citazione
2. Come si rendono i dati persistenti? Utilizzando il button back, l'Activity non ricarica i dati dal database specificati nell'onCreate() risultando in una ListView vuota.

Quando premi il pulsante back, viene richiamato l'onResume() dell'activity in cui arrivi, quindi potresti ricaricare i dati nell'onResume().


Citazione
3. Ho letto che il costruttore SimpleCursorAdapter usato nel tutorial è deprecato; viene consigliato di utilizzare un LoaderManager con un CursorLoader,
sapreste indicarmi qualche link di esempio?

Non mi è ancora capitato di usarlo, comunque qui c'è un esempio: LoaderManager | Android Developers. Se stai sviluppando per versioni di Android precedenti ad honeycomb, dovrai aggiungere la libreria Support Package | Android Developers. E' deprecato perché, se hai un database molto grande, c'è il rischio di bloccare l'interfaccia quando vai a prendere i dati nel database. In alternativa puoi "fregartene" per il momento e continuare ad usarlo, modificandolo in un prossimo aggiornamento.


Citazione
4. Quando nel tutorial si dice:
// consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento.
A parte il poco divertimento  :-), l'array di oggetti Prodotto devon essere dichiarati statici (vedi punto 2.)?

Non ho ben capito cosa intendi   :D, però l'idea di Qlimax, se non sbaglio e di creare una classe Product con una attributo nome e un attributo prezzo, in modo da poter poi inserirli nel database con un
Codice (Java): [Seleziona]
  db.insertProduct(product.name, product.price); oppure direttamente con
Codice (Java): [Seleziona]
  db.insertProduct(product);

Citazione
5. Sempre nel tutorial, quando viene impostato l'adapter:

Codice: [Seleziona]
productsLv.setAdapter(adapter);

Il codice fino a quel punto è sufficiente a popolare la ListView? Perchè nel mio caso la lista viene riempita correttamente, mentre se aggiungo
la parte successiva ricevo un NullPointerException.

Sì, è quello che serve per popolarla. Il resto viene utilizzato per visualizzare l'elenco dei prodotti in una textView, quindi non ha a che fare con la listView. Per sapere a cosa è dovuto il NullPointerException, dovresti dare un'occhiata al logcat.


Citazione
Codice: [Seleziona]
startManagingCursor(c);

Non ho ancora ben capito a cosa serve!

StartManagingCursor servere per gestire il cursor, ovvero aprirlo, chiuderlo, aggiornarlo in base al lifecycle dell'activity, onde evitare eventuali leak.

Offline Jarod56

  • Nuovo arrivato
  • *
  • Post: 29
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Lg Dual
  • Sistema operativo:
    Ubuntu 11.04 / Windows 7
Re:Condividere Database tra Activities
« Risposta #3 il: 13 Dicembre 2011, 17:01:17 CET »
0
Si infatti, basta fare
Codice (Java): [Seleziona]
MyDatabase db=new MyDatabase(getApplicationContext());e il gioco era fatto...
Abituato a java classico pensavo mi creassi un'oggetto MyDatabase nuovo, ma pensandoci sù era improbabile che mi facesse un nuovo database da zero  :-[
Ieri volevo mettere anchio la soluzione ma mi hai preceduto :D

Offline Audrey

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    AVD eclair 5554
  • Sistema operativo:
    Windows XP
Re:Condividere Database tra Activities
« Risposta #4 il: 22 Dicembre 2011, 13:19:28 CET »
0
Ragazzi ho dei dubbi anche io. Devo gestire i punti d'interesse di un gps organizzati per categoria. Così ho creato in un activity diversi button ognuno con il nome di una categoria.
Ora il mio dubbio è: come fare a memorizzare i record? devo fare un db per ogni button oppure posso usare lo stesso db magari utilizzando dei pezzi di codice a me sconosciuti?

per intenderci: se inserisco un record all'interno di un button (di una categoria), non mi deve apparire anche nell'altro button.

Offline and_bomb

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    i9000GT ICS 4.0.4
  • Sistema operativo:
    Mac OS X 10.7.3
Re:Condividere Database tra Activities
« Risposta #5 il: 02 Maggio 2012, 12:41:11 CEST »
0
Ciao ragazzi, ho seguito le indicazioni, io creo il database nella mia activity chiamata Activity1 ma se in un altra activity metto l'istruzione:
Codice (Java): [Seleziona]
MyDatabase db=new MyDatabase(getApplicationContext());
eclipse mi dice:

No enclosing instance of type Activity1 is accessible. Must qualify the allocation with an enclosing instance of type Activity1 (e.g. x.new A() where x is an instance of Activity1).
  o_O

p.s. sto utilizzando l'sdk per android 2.3.3

p.p.s. so che sto sbagliando una cavolata non uccidetemi!! :-P